暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

介绍一下mysql explain 执行计划

Mark 2026-06-26
98

当你执行 EXPLAIN SELECT ... 时,MySQL 并不会真正去查数据,而是给你出了一份“分拣方案”。我们只需要重点关注以下几个核心字段,就能轻松看懂这份方案:
1. 分拣顺序与对象(id, table)
id(分拣批次号):表示 SQL 中 SELECT 的执行顺序。id 值越大,优先级越高,越先执行;如果 id 相同,则从上往下依次执行。
table(处理的仓库):显示当前这一步正在访问哪张表或哪个临时表。
2. 分拣效率:type(最核心的性能风向标)
type 字段决定了 MySQL 查找数据的效率。你可以把它想象成找包裹的方式,按性能从好到差排序如下:
system / const(直接按门牌号送):最快!通常是通过主键或唯一索引进行精确匹配,一次就能定位到数据。
eq_ref(精准对接):常见于多表 JOIN 查询,被关联的表使用了主键或唯一索引,每次关联只返回一行。
ref(普通传送带):使用了非唯一索引进行等值查询,可能会匹配到多行数据。
range(划定区域找):在索引上进行了范围扫描(比如 >、<、BETWEEN、IN),比全表扫描快得多。
index(翻遍整个索引目录):扫描整棵索引树,虽然不用扫全表,但效率依然不高。
ALL(翻遍整个仓库):最差的情况,全表扫描。看到它就要警惕了,说明大概率缺索引或者索引失效了。
3. 传送带选择(possible_keys, key, key_len)
possible_keys(可能用的传送带):MySQL 觉得可以用来查找这张表的候选索引。
key(实际选的传送带):MySQL 经过成本计算后,真正决定使用的索引。如果是 NULL,说明没用到任何索引。
key_len(传送带的宽度/字节数):表示实际使用的索引长度。在联合索引中,可以通过这个值推算出到底用了几个字段。
4. 预估工作量(rows, filtered)
rows(需要检查的包裹数量):MySQL 预估为了找到目标数据,需要扫描的行数。这个数字越小越好。
filtered(二次人工挑拣的比例):初步筛选后,还需要满足剩余 WHERE 条件的行数百分比。100% 最好,说明没有多余的数据被过滤掉。
5. 额外操作标记(Extra - 重点看“坑”)
Extra 包含了执行时的附加动作。遇到以下几个词要特别留意:
🟢 Using index(覆盖索引):好消息!说明查询需要的列刚好都在索引里,不需要“回表”去查完整行数据,性能极佳。
🔴 Using filesort(文件排序):警告!说明 MySQL 无法利用索引完成排序,只能把数据拿出来放到内存或磁盘里重新排序,非常耗时。
🔴 Using temporary(临时堆货区):警告!说明查询过程中创建了临时表(常见于复杂的 GROUP BY 或 UNION),极其消耗资源,必须优化。
🟡 Using where(人工挑拣):说明存储引擎返回数据后,Server 层还要再用 WHERE 条件过滤一遍。
💡 极简记忆口诀(面试/实战必备):
看 EXPLAIN 结果,只需三步走:
看 type:有没有达到 ref 或 range?是不是 ALL 全表扫描?
看 key:有没有走预期的索引?
看 Extra:有没有出现 filesort 和 temporary 这两个性能杀手?
用这套逻辑去套你平时写的慢 SQL,优化思路瞬间就会清晰很多!

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论