EXPLAIN 速读手册

执行计划是数据库的 X 光片。本页把胶片上的每一列讲清:哪三列必须看、哪五档 type 要背、 Extra 里哪两个词要报警——印出来,贴机房墙上。

口令 · type → rows → Extra 用途 · 每句 SQL 提交前 配套 · 慢查询急诊案例集
01 / COLUMNS全列解读

十几列里,必看的只有三列

别一上来就讲全部列。课堂优先级标出来了:⭐⭐⭐ 必看,⭐ 用到再讲,「略」的进阶再说。

列干什么课堂优先级一句话
id序号,越大越先执行⭐讲子查询那天再用
select_type简单查询还是子查询⭐出现 DERIVED 时先别慌
table这一步摸哪张表⭐⭐多表 JOIN 时一行行对
type访问方式:全表还是索引⭐⭐⭐五档速查见下表
possible_keys理论上能用的索引⭐「有它没用上」= 最左前缀出问题
key实际用了哪个索引⭐⭐⭐NULL = 索引白建了
key_len索引用了前几列⭐联合索引命中几列,看这里
rows预估要摸多少行⭐⭐⭐和返回行数差得越远越亏
filtered摸完之后剩几成略进阶再讲
Extra附加动作:排序、临时表⭐⭐⭐两个报警词见下表
02 / TYPEtype 五档速查

从 const 到 ALL,五档背下来

type触发条件速度感下一步动作
const主键 / 唯一键等值查询一次定位不用动,这就是标准答案
ref普通索引等值查询小段扫描看 rows,量小即达标
range索引上的范围查询区间扫描检查范围是否够窄
index顺序扫整棵索引树比 ALL 快点警惕:仍然在扫,量大了不行
ALL没有可用索引全表摸报警。第一反应:索引呢?

口诀给学生:const 和 ref 是绿灯,range 看情况,index 和 ALL 要有理由。写不出理由的 ALL,就是作业没做完。

03 / EXTRAExtra 常见值

两个报警词,三个绿灯

Extra 是最容易看出「病」的一列。先教学生认这两个红灯:Using temporary 和 Using filesort。

Extra含义好坏处方
Using index覆盖索引:索引里就取到数,不回表✅ 绿灯保持,这是最优形态
Using index condition索引条件下推:部分过滤在索引层完成✅ 绿灯保持
Using where服务层还要再过滤一遍➖ 中性结合 rows 判断大小
Using filesort排序没吃到索引,额外排一遍⚠️ 报警给排序列建索引,或并入联合索引
Using temporary建了临时表(去重 / 派生)⚠️ 报警检查 GROUP BY 与 DISTINCT
04 / CASES同一句 SQL 的三份计划

1.84 秒 → 0.02 秒的三张脸

就是首页那张查询:选课数 Top 5。三个版本贴在一起讲,胜过讲十遍索引原理。

版本索引typerowsExtra耗时
① 裸奔无ALL1,204,880Using temporary; Using filesort1.84 s
② 加 term 索引idx_enroll_term (term)ref37Using index condition0.02 s
③ 覆盖升级idx_term_student (term, student_id)ref37Using index0.02 s

三行各一句话:① 全表摸 120 万行,还欠两笔排序债;② term 把范围钉死,只摸 37 行;③ 连回表都省了——查询要的列索引里全有。同一句话,三张脸,这就是这门课要学生亲眼看见的东西。

05 / MYTHS三个常见误读

先把谣言破掉

✕「rows 是精确值」——它是估算,统计信息旧了会偏。数量级对就行,别抠个位数。
✕「range 一定比 ref 慢」——看 rows,不看字母表顺序。ref 摸 80 万行,输给 range 摸 200 行。
✕「索引建了就会用」——列上套函数、隐式转换、最左前缀断了,key 直接 NULL。索引存在 ≠ 用得上。
✓正确姿势:每次只改一个变量(加一条索引 / 改一处写法),重跑 EXPLAIN,前后对比贴进作业。
「先看 type,再看 rows,最后看 Extra。」 —— 全班背下来。看计划就像看化验单,顺序不能乱;第三个必看的同学,才算入了门。