MySQL EXPLAIN 深度解析:优化必备技能
·
EXPLAIN 深度精讲:看懂 MySQL 到底怎么执行你的 SQL
这是数据库优化最核心、面试必考、工作必用的技能。我用最适合初学者的方式,从作用 → 每个字段含义 → 怎么判断好坏 → 实战案例,一步到位讲透。
一、EXPLAIN 到底是干嘛的?
一句话:
在 SELECT 前面加 EXPLAIN,不会真正执行查询,只会让 MySQL 告诉你:它打算怎么查这条 SQL。
就像你要去旅行:
- 不直接出发
- 先看“导航规划路线”
EXPLAIN 就是这条导航路线图。
作用:
- 看有没有用到索引
- 看是不是全表扫描
- 看扫描了多少行
- 看有没有额外开销(排序、临时表)
- 快速定位慢查询原因
二、最简单使用方式
EXPLAIN SELECT * FROM user WHERE id = 100;
执行后会出现一张表,我们只需要重点看 4 个字段:
- type 访问类型(最重要,判断索引好坏)
- key 实际使用了哪个索引
- rows 预估扫描多少行(越少越快)
- Extra 额外信息(看有没有坏东西)
三、深度讲解 4 个关键字段
1. type:访问类型(最重要!)
表示 MySQL 用哪种方式找到数据。
性能从好到坏排序:
system > const > eq_ref > ref > range > index > ALL
你只需要记住:
- ALL:最坏,全表扫描(没用到索引)
- index:扫整个索引树
- range:索引范围查询(between、in、>、<)
- ref:普通索引匹配
- const / system:最好,主键/唯一索引,一次命中
初学者判断标准
- 看到 ALL → 索引有问题,必须优化
- 看到 range/ref → 正常不错
- 看到 const → 非常快
2. key:实际使用的索引
- 显示真正用到的索引名称
- 如果是 NULL → 没用到任何索引
- 如果你建了索引但 key 是 NULL → 索引失效了
例子:
key = PRIMARY → 用了主键索引
key = idx_user_phone → 用了手机号索引
key = NULL → 没走索引,全表扫描
3. rows:预估扫描行数
MySQL 估算要扫多少行数据才能找到结果。
- 数字越小越快
- 大表如果 rows 几十万、几百万 → 一定慢
- 索引优化的目标:让 rows 尽可能小
4. Extra:额外信息(看有没有“坏东西”)
这里显示 MySQL 做了哪些额外操作。
你要重点认识这 3 个:
① Using filesort
坏!
MySQL 无法用索引排序,必须自己额外排序。
出现这个 → 慢查询重灾区。
② Using temporary
非常坏!
用到了临时表,通常是 GROUP BY / ORDER BY 没建好索引。
③ Using index
非常好!
覆盖索引,直接从索引取数据,不用回表。
四、实战案例(一看就懂)
案例1:没索引,全表扫描
EXPLAIN SELECT * FROM user WHERE name = '张三';
结果:
- type = ALL
- key = NULL
- rows = 10000
- Extra:NULL
→ 全表扫描,非常慢,必须加索引
案例2:用主键索引,极快
EXPLAIN SELECT * FROM user WHERE id = 100;
结果:
- type = const
- key = PRIMARY
- rows = 1
- Extra:NULL
→ 最快,完美
案例3:索引范围查询
EXPLAIN SELECT * FROM user WHERE age BETWEEN 18 AND 30;
结果:
- type = range
- key = idx_age
- rows = 500
- Extra:Using index condition
→ 正常,不错
案例4:出现坏信号 Using filesort
EXPLAIN SELECT * FROM user ORDER BY age;
- Extra: Using filesort
→ 必须给 age 建索引
五、初学者最简单判断口诀(背会就能优化)
-
看 type:
- ALL = 烂
- range/ref = 正常
- const = 优秀
-
看 key:
- NULL = 没走索引
- 有名字 = 走了索引
-
看 rows:
- 越小越快
-
看 Extra:
- 出现 filesort / temporary = 赶快优化
- 出现 Using index = 完美
六、总结(最精炼版)
EXPLAIN 就是 MySQL 的执行计划导航。
- type 判断查询效率
- key 看有没有用索引
- rows 看扫描多少数据
- Extra 看有没有额外坏操作
学会 EXPLAIN,你就真正入门 MySQL 性能优化了。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)