mysql 使用 explain 查询执行计划 不同的字段有什么意思

先给大家分享个干货资源——2025年Java面试宝典:
链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g 提取码: 9b3g
这个网盘里整理了高频考点和实战解析,建议搭配本文一起看效果更佳!
一、为什么要用 EXPLAIN 看执行计划?
面试中遇到 SQL 优化问题,面试官必问的就是:“说说 EXPLAIN 的字段含义”。EXPLAIN 是 MySQL 的执行计划分析工具,它能告诉你数据库怎么处理你的 SQL 语句——比如用哪个索引、是否全表扫描、有没有临时表等。这些信息直接决定了 SQL 的性能上限。
举个例子:如果 type 字段显示 ALL,说明这条 SQL 在扫全表,这时候就得赶紧优化索引了;如果 Extra 出现 Using filesort,说明排序没走索引,可能拖慢查询速度。掌握 EXPLAIN 各个字段的含义,就像拿到了 SQL 优化的“CT扫描仪”。
二、EXPLAIN 执行计划字段详解
2.1 id:执行顺序的身份证
id 代表查询中每个子步骤的执行顺序。如果多个步骤的 id 相同,说明这些步骤是同一层级的,执行顺序从上到下;如果 id 不同,数值大的先执行。比如嵌套查询时,内层子查询的 id 会比外层的大。
2.2 select_type:查询类型识别码
这个字段告诉你当前步骤是哪种查询类型:
- SIMPLE:简单查询(没有子查询或 UNION)
- PRIMARY:外层主查询
- SUBQUERY:子查询中的第一个 SELECT
- DERIVED:衍生表(比如 FROM 后的子查询生成的临时表)
如果是 UNION 查询,还会出现UNION或UNION RESULT类型。

2.3 table:操作的是哪张表?
这里显示当前步骤操作的表名。如果是子查询生成的临时表,可能会显示 <derivedN>(N是子查询的 id)。如果是 UNION 合并的结果,可能显示 <union1,2> 这样的格式。
2.4 partitions:分区命中情况
如果表做了分区设计,这个字段会显示实际命中的分区名称。没分区的话这里就是 NULL。
2.5 type:访问类型(重点!)
这是面试高频考点!表示 MySQL 如何查找数据,性能从高到低排序:
- system:表只有一行数据(系统表)
- const:通过主键或唯一索引查到一条记录
- eq_ref:联表查询时,主键或唯一索引匹配(比如
A.id = B.id) - ref:非唯一索引查找
- range:索引范围扫描(BETWEEN、IN、>等操作)
- index:全索引扫描
- ALL:全表扫描(必须优化!)
2.6 possible_keys:可能用到的索引
显示查询可能会用到的索引列表,但实际不一定用。如果这里为空,说明没有可用索引,得考虑加索引了。
2.7 key:实际使用的索引
MySQL 最终选择的索引。如果显示 NULL,说明没走索引;如果和 possible_keys 不一致,可能是优化器觉得其他索引更优。
2.8 key_len:索引长度
表示索引中使用的字节数。比如联合索引 (a,b,c),如果只用到 a 和 b,这里会显示前两列的长度总和。这个值越大,说明用到的索引越充分。
2.9 ref:索引匹配的列
显示索引查找时用了哪些列或常量。比如 const 表示用常量值匹配索引,func 表示用了函数处理。
2.10 rows:预估扫描行数
MySQL 估计要扫描多少行才能返回结果。这个值越小越好,如果数值很大,说明索引可能没生效。
2.11 filtered:过滤比例
表示存储引擎返回的数据经过 WHERE 条件过滤后剩下的百分比。比如 rows=1000,filtered=10%,则最终大约要处理 1000×10% = 100 行。
2.12 Extra:附加信息(细节杀手)
这里会显示一些关键细节,比如:
- Using index:覆盖索引(不需要回表)
- Using where:WHERE 条件过滤了部分数据
- Using temporary:用了临时表(常见于 GROUP BY/ORDER BY 没走索引)
- Using filesort:文件排序(需要优化排序字段的索引)

三、实战技巧:如何快速定位 SQL 问题?
- 先看 type 是否出现
ALL或index - 检查 key 是否实际用了索引
- 关注 Extra 中的警告(如
Using filesort) - 结合 rows 和 filtered 评估数据扫描量
如果你正在准备面试,可以试试在 面试鸭返利网 购买会员,通过返利能省25元。他们的题库更新快,覆盖了MySQL优化、索引设计等高频考点,特别适合突击复习!


