MySQL EXPLAIN 字段解读
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
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 谜思录!