排查慢 SQL 的 6 步「急诊流程」——一句口诀:
“开监控 → 抓现场 → 看计划 → 分段测 → 改索引 → 压验证”。
-
开监控
• 打开慢日志:SET long_query_time=0.1;
(秒)
• 或实时:information_schema.processlist
/performance_schema.events_statements_summary_by_digest
-
抓现场
•SHOW FULL PROCESSLIST
看正在跑的慢 SQL
•pt-query-digest
/mysqldumpslow
把慢日志排序 TOP-N -
看计划
•EXPLAIN ANALYZE
(MySQL 8) 或EXPLAIN FORMAT=JSON
• 重点:type ≥ ALL 需优化;key 为 NULL 没命中索引;rows 过大;Extra 含Using filesort
/Using temporary
-
分段测
• 把 WHERE、JOIN、ORDER BY、LIMIT 逐段注释,找耗时拐点
• 用optimizer trace
看优化器为何选错索引 -
改索引
• 缺索引:按最左前缀补联合索引
• 索引失效:函数、隐式转换、LIKE '%xx' → 重写 SQL 或生成列
• 回表太多:建覆盖索引,让 Extra 变Using index
-
压验证
• 改完跑sysbench
或业务压测,对比慢日志 RT/QPS
• 回归:确认无新慢 SQL 产生
总结:
慢日志 → EXPLAIN → trace → 索引/重写 → 压测 → 上线。