华为云 RDS for MySQL 慢查询排查的五个步骤

举报
yd_277691252 发表于 2026/10/26 11:13:09 2026/10/26
【摘要】 慢查询排查别从 EXPLAIN 开始很多人一发现慢查询就直接 EXPLAIN。但如果连“哪条 SQL 慢、慢在什么阶段”都不清楚,EXPLAIN 往往是在猜。我的习惯是按下面五步走,先定位再分析。 第一步:确认慢查询日志真的开着long_query_time 默认 10 秒,很多慢在 1~3 秒的 SQL 根本不会进日志。生产上一般调到 1 秒,并确认 slow_query_log 为 O...

慢查询排查别从 EXPLAIN 开始

很多人一发现慢查询就直接 EXPLAIN。但如果连“哪条 SQL 慢、慢在什么阶段”都不清楚,EXPLAIN 往往是在猜。我的习惯是按下面五步走,先定位再分析。

第一步:确认慢查询日志真的开着

long_query_time 默认 10 秒,很多慢在 1~3 秒的 SQL 根本不会进日志。生产上一般调到 1 秒,并确认 slow_query_log 为 ON。

SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';

第二步:按总耗时排序,而不是按单次最慢

mysqldumpslow 或 pt-query-digest 都能做聚合。关键看总耗时占比:一条 0.5 秒但每秒执行 100 次的 SQL,危害远大于一条偶发的 8 秒大查询。先治高频的那条。

第三步:看执行计划里的三个信号

EXPLAIN FORMAT=JSON SELECT ...;

重点看三处:

  • type 是否为 ALL(全表扫描)或 index(全索引扫描)
  • rows 估算行数是否远大于实际返回行数
  • Extra 是否出现 Using filesort、Using temporary

出现 filesort 说明排序没走索引,出现 temporary 说明用了临时表,这两个在数据量上来后会急剧恶化。

第四步:区分是 SQL 问题还是负载问题

同一个 SQL 在低峰期快、高峰期慢,往往不是索引问题,而是并发或锁等待。这时候要看:

SHOW ENGINE INNODB STATUS;
SELECT * FROM performance_schema.data_lock_waits;

如果是锁等待,优化 SQL 没用,要改事务粒度或加读写分离。

第五步:改完之后必须回归验证

加索引后要确认两件事:执行计划真的变了(rows 明显下降),以及写入没有明显变慢。索引不是越多越好,联合索引的顺序错了等于白加。

一个常被忽略的点

RDS 控制台的慢日志查询方便,但默认只保留有限天数,且采样可能有延迟。做长期分析建议自己把慢日志采集出去,落到 OBS 或自建表里,比在控制台翻页靠谱。

排查慢查询的收益不在“解决这一条”,而在于把这类问题模式化,下次遇到同类能直接跳到结论。不做这一步,每次都在重新摸索。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。