explain 用于查看查询执行计划,判断索引使用、回表、临时表等情况;show profile 用于定位各阶段实际耗时,如排序、临时表、i/o 等瓶颈。两者配合可高效排查慢查询。

EXPLAIN 和 SHOW PROFILE 是 MySQL 中两个轻量但实用的慢查询分析工具:前者看执行计划,判断是否走索引、是否回表、是否使用临时表等;后者看实际执行各阶段耗时,定位瓶颈在解析、排序、发送数据还是磁盘 I/O。
用 EXPLAIN 看懂查询“怎么跑”
在 SQL 前加 EXPLAIN 即可查看优化器选择的执行策略。重点关注以下几列:
-
type:连接类型,
const、ref、range较好,ALL表示全表扫描,需警惕 -
key:实际使用的索引名,为
NULL说明没走索引 - rows:预估扫描行数,远大于结果集行数时,可能索引失效或选择不佳
-
Extra:常见提示如
Using filesort(需额外排序)、Using temporary(建临时表)、Using index(覆盖索引,理想状态)
用 SHOW PROFILE 定位“哪一步慢”
需先开启配置:SET profiling = 1;,再执行目标 SQL,之后用 SHOW PROFILES; 查看最近执行的语句 ID,再用 SHOW PROFILE FOR QUERY N; 查看详细耗时分布。
- 关注
Status列中耗时高的阶段,例如Sorting result或Copying to tmp table - 若
Creating sort index或Sorting scan时间长,说明ORDER BY缺少合适索引 - 若
Sending data异常高,可能是返回字段过多、大文本字段未过滤,或存在隐式类型转换导致索引失效
配合使用的典型排查流程
- 先用
EXPLAIN确认执行计划是否合理,是否存在全表扫描、临时表、文件排序 - 若执行计划看似正常但实际很慢,开启
profiling查看真实耗时分布 - 结合两者判断:比如
EXPLAIN显示走了索引但SHOW PROFILE显示大量时间花在Copying to tmp table,可能是GROUP BY字段没索引,或聚合字段无法利用索引 - 修改后再次
EXPLAIN对比,确认优化生效
注意点与限制
-
SHOW PROFILE在 MySQL 8.0 中已被标记为废弃,建议生产环境优先使用performance_schema替代 -
EXPLAIN展示的是预估执行计划,受统计信息影响,可用ANALYZE TABLE更新统计信息提升准确性 - 对带子查询、UNION、存储过程的复杂语句,
EXPLAIN输出较难解读,可拆解为单个子查询分别分析










