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。三个版本贴在一起讲,胜过讲十遍索引原理。
| 版本 | 索引 | type | rows | Extra | 耗时 |
|---|---|---|---|---|---|
| ① 裸奔 | 无 | ALL | 1,204,880 | Using temporary; Using filesort | 1.84 s |
| ② 加 term 索引 | idx_enroll_term (term) | ref | 37 | Using index condition | 0.02 s |
| ③ 覆盖升级 | idx_term_student (term, student_id) | ref | 37 | Using index | 0.02 s |
三行各一句话:① 全表摸 120 万行,还欠两笔排序债;② term 把范围钉死,只摸 37 行;③ 连回表都省了——查询要的列索引里全有。同一句话,三张脸,这就是这门课要学生亲眼看见的东西。
05 / MYTHS三个常见误读
先把谣言破掉
✕「rows 是精确值」——它是估算,统计信息旧了会偏。数量级对就行,别抠个位数。
✕「range 一定比 ref 慢」——看 rows,不看字母表顺序。ref 摸 80 万行,输给 range 摸 200 行。
✕「索引建了就会用」——列上套函数、隐式转换、最左前缀断了,key 直接 NULL。索引存在 ≠ 用得上。
✓正确姿势:每次只改一个变量(加一条索引 / 改一处写法),重跑 EXPLAIN,前后对比贴进作业。
「先看 type,再看 rows,最后看 Extra。」
—— 全班背下来。看计划就像看化验单,顺序不能乱;第三个必看的同学,才算入了门。