阿里云 MySQL 慢查询定位和索引优化是怎么进行的?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
本文由云服务器代理商:云枢国际yunshuguoji撰写。
第一部分:开启慢日志,定位慢 SQL
步骤 1:开启慢查询日志
进入 RDS 实例详情页 → 参数设置
搜索参数:
slow_query_log:改为 ON(开启慢日志)
long_query_time:推荐设 1(执行超过 1 秒即记录)
log_output:FILE(日志存入文件)
保存参数修改,重启实例生效(测试低峰操作)
步骤 2:下载 / 查看慢日志文件
实例详情 → 日志管理 → 慢日志
筛选时间范围,点击下载日志文件
日志内可直观看到:执行 SQL、耗时、扫描行数、访问时间
步骤 3:可视化分析(推荐,不用读日志文本)
进入「性能洞察 / CloudDBA」
选择慢 SQL 分析,系统自动聚合:耗时 Top SQL、扫描行数过大语句、高频重复查询
重点标记两类高危语句:
单次执行耗时>3s
扫描行数几十万,但返回结果极少(无索引)
第二部分:验证 SQL 缺少索引(Explain 分析)
RDS 控制台打开「SQL 执行窗口」,输入慢 SQL
语句前加 EXPLAIN 执行,查看返回结果关键字段:
type:出现 ALL → 全表扫描,必须加索引
rows:扫描行数巨大
key:NULL,代表当前无可用索引
第三部分:索引优化实操方案
方案 1:普通单列索引(等值查询,如手机号、订单号)
执行语句:
CREATE INDEX idx_字段 ON 表名(字段);
方案 2:联合复合索引(多条件筛选,where a=? and b=?)
CREATE INDEX idx_ab ON 表(a,b);
规则:等值字段放前面,范围条件(> < like)放末尾
方案 3:前缀索引(长文本、商品标题)
CREATE INDEX idx_title ON goods(title(64));
方案 4:删除无用冗余索引
CloudDBA 索引分析会提示重复、长期未使用索引
删除语句:DROP INDEX 索引名 ON 表名;
第四部分:优化后校验
再次用 EXPLAIN 执行原慢 SQL
type 变为 range/ref,key 显示新建索引名
回到性能洞察观察:平均执行耗时明显下降、CPU 负载降低