必须盯紧type、key、rows、extra四列:type=all或index需警惕索引缺失,key为空表示索引失效,rows远大于结果行数说明扫描低效,extra含using filesort/temporary必须优化。

EXPLAIN 输出里哪些字段必须盯紧
别一上来就扫全表,重点只看 type、key、rows、Extra 这四列。其他字段(比如 id 或 select_type)只在复杂查询里才有意义,日常单表或两表 JOIN 时基本不用深究。
type 决定访问效率:从 const 到 ALL 是性能断崖式下滑。只要看到 type=ALL 且 rows 数值远大于实际结果行数(比如查 10 条却扫 50 万行),基本就是索引没生效或根本没建对。
key 为 NULL 但 possible_keys 有值?说明优化器“看见”了索引,但没选——常见原因包括:WHERE 条件用了函数(如 WHERE YEAR(create_time) = 2023)、隐式类型转换(varchar 字段跟数字比较)、或者索引字段顺序不匹配最左前缀规则。
-
rows是预估值,不是精确值,但数量级错得离谱(比如显示 1 却实际扫描上千行)往往意味着统计信息过期,可执行ANALYZE TABLE table_name更新 -
Extra出现Using filesort或Using temporary时,哪怕type是ref,排序或分组逻辑也可能拖垮性能,尤其在ORDER BY或GROUP BY涉及非索引字段时
EXPLAIN FORMAT=TREE 比传统表格更直观
MySQL 8.0+ 默认的表格输出容易漏掉嵌套关系,特别是多层子查询或派生表。直接用 EXPLAIN FORMAT=TREE 能一眼看出执行顺序和依赖层级:
EXPLAIN FORMAT=TREE SELECT * FROM orders WHERE user_id IN (SELECT id FROM users WHERE status = 'active');
输出是缩进树状结构,驱动表在最外层,子查询自动缩进,比反复对照 id 列判断执行先后要可靠得多。
注意:FORMAT=TREE 不支持 EXPLAIN ANALYZE(后者会真实执行并带耗时),两者不能共存。需要实测耗时得单独跑 EXPLAIN ANALYZE,但它的 JSON 输出较难读,建议配合 MySQL Workbench 的 Visual Explain 图形界面看。
- 如果
EXPLAIN FORMAT=TREE显示某层是materialized(物化),说明子查询被转成临时表,这时要检查子查询是否能改写成 JOIN - 树中出现
-> Filter节点,代表条件下推失败,可能因字段类型不一致或函数包裹导致
为什么加了索引,EXPLAIN 还显示 type=ALL
索引存在 ≠ 被使用。常见硬伤有三个:
- 查询条件用了
LIKE '%abc'—— 左模糊直接让 B+ 树索引失效,LIKE 'abc%'才能走索引 -
OR条件两边字段没同时建在同一个复合索引里,比如WHERE a = 1 OR b = 2,即使有INDEX(a)和INDEX(b),优化器也可能放弃索引选全表扫描 - 字符集/排序规则不一致,比如表字段是
utf8mb4_unicode_ci,而查询参数是utf8mb4_general_ci,触发隐式转换,索引失效
验证方式很简单:把 WHERE 条件拆开单独 EXPLAIN,比如 EXPLAIN SELECT * FROM t WHERE a = 1 和 EXPLAIN SELECT * FROM t WHERE b = 2,看各自是否走索引。如果都走,再合起来不行,大概率是 OR 导致的索引选择策略问题。
EXPLAIN ANALYZE 实际执行后才暴露真瓶颈
EXPLAIN 只模拟执行计划,EXPLAIN ANALYZE 才真正跑一遍并返回各算子实际耗时。它能揪出计划“看起来好”但实际很慢的场景:
- 预估
rows=100,实际扫描 10 万行 → 统计信息严重滞后 - 计划显示
Using index(覆盖索引),但EXPLAIN ANALYZE显示该步骤耗时占比 90% → 磁盘 I/O 或缓冲池压力大,不是 SQL 本身问题 - JOIN 顺序和
EXPLAIN一致,但某张表的actual rows比预估高两个数量级 → 关联字段数据分布倾斜(比如 90% 的user_id都是 1),导致连接放大
注意:EXPLAIN ANALYZE 会真实执行语句,**禁止在生产环境对写操作(UPDATE/DELETE)或大数据量 SELECT 直接使用**。先用小 LIMIT 测试,或在从库、影子库上验证。
真正卡住的地方,往往不在 type 或 key 这些静态指标上,而在数据分布、缓存命中率、锁等待这些运行时状态里——EXPLAIN ANALYZE 是唯一能跨过“纸面计划”直击现场的工具。











