EXPLAIN 是 SQL 优化的第一工具。本文完整解读每个字段,并附 10 个生产案例。

一、EXPLAIN 基础

  • 1.1 EXPLAIN 的作用——查看执行计划
  • 1.2 EXPLAIN FORMAT=JSON——更详细的信息
  • 1.3 EXPLAIN ANALYZE(MySQL 8.0.18+)——实际执行时间

二、id——查询的序号

  • 2.1 id 相同——从上到下执行
  • 2.2 id 不同——id 越大越先执行
  • 2.3 子查询和联合查询的 id 表现

三、select_type——查询类型

  • 3.1 SIMPLE——简单查询
  • 3.2 PRIMARY——最外层查询
  • 3.3 SUBQUERY / DERIVED / UNION / UNION RESULT
  • 3.4 DEPENDENT SUBQUERY——相关子查询,性能隐患

四、type——访问类型(最重要)

  • 4.1 system / const——主键或唯一索引等值查询
  • 4.2 eq_ref——关联查询中唯一匹配
  • 4.3 ref——非唯一索引等值查询
  • 4.4 range——索引范围扫描
  • 4.5 index——全索引扫描
  • 4.6 ALL——全表扫描,需要优化
  • 4.7 从好到差的排序

五、possible_keys & key

  • 5.1 possible_keys——可能用到的索引
  • 5.2 key——实际使用的索引
  • 5.3 key_len——使用的索引长度,判断联合索引用了几个字段

六、rows & filtered

  • 6.1 rows——预估扫描行数
  • 6.2 filtered——过滤后剩余的比例
  • 6.3 rows × filtered 估算实际返回行数

七、Extra——额外信息

  • 7.1 Using index——覆盖索引,不需要回表
  • 7.2 Using where——Server 层过滤
  • 7.3 Using index condition——索引下推
  • 7.4 Using temporary——临时表,需要优化
  • 7.5 Using filesort——文件排序,需要优化
  • 7.6 Using join buffer——关联查询缓冲区

八、10 个真实案例

  • 8.1 全表扫描变 ref——加索引
  • 8.2 Using filesort 优化——调整 ORDER BY 字段
  • 8.3 联合索引用了一半——key_len 判断
  • 8.4~8.10 更多典型案例

九、总结

  • EXPLAIN 解读的优先级:type > rows > Extra
  • 优化目标:type 尽量在前 4 级,Extra 避免 filesort 和 temporary