SQL慢查询分析工具_EXPLAIN与SHOW PROFILE使用

7次阅读

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

SQL慢查询分析工具_EXPLAIN与SHOW PROFILE使用

EXPLAINSHOW PROFILEmysql 中两个轻量但实用的慢查询分析工具:前者看执行计划,判断是否走索引、是否回表、是否使用临时表等;后者看实际执行各阶段耗时,定位瓶颈在解析、排序、发送数据还是磁盘 I/O。

用 EXPLAIN 看懂查询“怎么跑”

在 SQL 前加 EXPLAIN 即可查看优化器选择的执行策略。重点关注以下几列:

  • type:连接类型,constrefrange 较好,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 resultCopying to tmp table
  • Creating sort indexSorting 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 输出较难解读,可拆解为单个子查询分别分析
text=ZqhQzanResources