EXPLAIN 深度精讲:看懂 MySQL 到底怎么执行你的 SQL

这是数据库优化最核心、面试必考、工作必用的技能。我用最适合初学者的方式,从作用 → 每个字段含义 → 怎么判断好坏 → 实战案例,一步到位讲透。


一、EXPLAIN 到底是干嘛的?

一句话:
在 SELECT 前面加 EXPLAIN,不会真正执行查询,只会让 MySQL 告诉你:它打算怎么查这条 SQL。

就像你要去旅行:

  • 不直接出发
  • 先看“导航规划路线”
    EXPLAIN 就是这条导航路线图

作用:

  • 看有没有用到索引
  • 看是不是全表扫描
  • 看扫描了多少行
  • 看有没有额外开销(排序、临时表)
  • 快速定位慢查询原因

二、最简单使用方式

EXPLAIN SELECT * FROM user WHERE id = 100;

执行后会出现一张表,我们只需要重点看 4 个字段

  1. type 访问类型(最重要,判断索引好坏)
  2. key 实际使用了哪个索引
  3. rows 预估扫描多少行(越少越快)
  4. 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 建索引

五、初学者最简单判断口诀(背会就能优化)

  1. 看 type:

    • ALL = 烂
    • range/ref = 正常
    • const = 优秀
  2. 看 key:

    • NULL = 没走索引
    • 有名字 = 走了索引
  3. 看 rows:

    • 越小越快
  4. 看 Extra:

    • 出现 filesort / temporary = 赶快优化
    • 出现 Using index = 完美

六、总结(最精炼版)

EXPLAIN 就是 MySQL 的执行计划导航

  • type 判断查询效率
  • key 看有没有用索引
  • rows 看扫描多少数据
  • Extra 看有没有额外坏操作

学会 EXPLAIN,你就真正入门 MySQL 性能优化了。


Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐