如何使用 SQL EXPLAIN 分析 SELECT 执行计划
时间:2026-08-25 | 作者:电竞小硕 | 阅读:0EXPLAIN最关键字段是type、key、rows、filtered和Extra:type决定扫描效率(ALL最差),key指示索引命中情况,rows为预估扫描行数,filtered反映过滤比例,Extra中Using filesort或Using temporary提示性能风险;FORMAT=JSON才能看清嵌套结构与成本细节。
EXPLAIN 能直接告诉你数据库实际怎么执行你的 SELECT,但不加 FORMAT=JSON 或看懂 type/key 字段,基本等于白看。
EXPLAIN 输出里哪些字段最关键
MySQL 8.0+ 默认输出是传统表格格式,真正影响性能的字段就几个:type、key、rows、filtered、Extra。其中 type 是扫描方式,从 system(最快)到 ALL(全表扫描,最危险);key 显示是否命中索引,为空就说明没走索引;rows 是预估扫描行数,不是结果行数;Extra 里出现 Using filesort 或 Using temporary 就得警惕——排序或分组没走索引。
常见误读:rows 值小 ≠ 快,如果 type 是 ALL,哪怕 rows=100,也可能扫完整张表(因为统计信息不准);key 显示某个索引名,不代表用上了全部列,得结合 key_len 看用了前几字节。
为什么加 FORMAT=JSON 才算真看清执行逻辑
默认的文本格式会将子查询、UNION、LATERAL这类结构的嵌套关系和代价估算隐藏起来,在文本里它们被压成一行,根本看不出来执行顺序。而 EXPLAIN FORMAT=JSON 返回的则是完整的执行树,其中包含了 cost_info、used_columns、attached_condition等关键细节。
实操建议:
- 调试慢查询时,一律用
EXPLAIN FORMAT=JSON SELECT ...,别省这一步 - 重点关注 JSON 中的
query_block.nested_loop结构,它暴露了 JOIN 的实际驱动顺序 - 如果看到
"using_join_buffer": "Block Nested Loop",说明没有合适索引,MySQL 在用缓存块做嵌套循环,大概率要优化 JOIN 条件或加索引
EXPLAIN 不会告诉你但必须手动验证的三件事
EXPLAIN 是预估,不执行,所以它不反映真实数据分布、锁竞争、缓冲池命中率这些运行时因素。你得自己补上验证:
- 执行
SELECT COUNT(*)对比EXPLAIN的rows,如果差 10 倍以上,说明统计信息过期,需运行ANALYZE TABLE - 在生产库低峰期对目标表加
SELECT ... FOR SHARE,观察是否被其他事务阻塞——EXPLAIN完全不体现锁行为 - 用
SHOW PROFILE或 performance_schema 查看真实耗时分布,确认瓶颈是在 “Sending data” 还是 “Copying to tmp table”,前者可能是磁盘 I/O,后者大概率是没走索引的 GROUP BY 或 ORDER BY
PostgreSQL 和 SQLite 的 EXPLAIN 差异点
语法看似相同,实则语义大相径庭:PostgreSQL的EXPLAIN (ANALYZE, BUFFERS)会真正执行,并返回实际耗时以及缓存读写次数;而MySQL的EXPLAIN永远不会执行;SQLite的EXPLAIN QUERY PLAN则更为轻量级,它仅输出大致策略,如“SCAN TABLE users”或“SEARCH TABLE orders USING INDEX idx_user_id”,但不提供行数或索引长度。
所以跨数据库调优时:
- 在 PostgreSQL 上,优先用
EXPLAIN (ANALYZE, BUFFERS),别只用基础EXPLAIN - SQLite 里想确认是否用索引,看输出里有没有
USING INDEX字样,没有就是全表扫描 - 别把 MySQL 的
key_len直接套到 PG 的输出里——PG 根本不提供这个字段
真正卡住人的往往不是看不懂 EXPLAIN 字段,而是忘了它不执行、不锁表、不反映并发压力——所有结论都得拿真实执行结果交叉验证。
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- 如何通过EXPLAIN中key_len判断联合索引生效字段
- 时间:2026-08-18
精选合集
更多大家都在玩
大家都在看
更多-
- 糖尿病完全不能吃糖吗
- 时间:2026-09-15
-
- 蚂蚁庄园小课堂2026年9月16日最新题目答案
- 时间:2026-09-15
-
- 小鸡答题今天的答案是什么2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园每日答题答案2026年9月16日
- 时间:2026-09-15
-
- 以下哪种粮食是酿造绍兴黄酒的主要原料 蚂蚁庄园今日答案9月16日
- 时间:2026-09-15
-
- 劝学名句“及时当勉励,岁月不待人”出自哪位诗人 蚂蚁庄园今日答案9.16
- 时间:2026-09-15
-
- 蚂蚁庄园今天答题答案2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园答题今日答案2026年9月16日
- 时间:2026-09-15
