【知识点007】mysql的explain命令

EXPLAIN 输出的常见列及含义

列名 含义
id 查询中每个表的标识编号。值越大优先级越高(表示嵌套查询层级)。
select_type 查询的类型(如 SIMPLE、PRIMARY、SUBQUERY、DERIVED 等)。
table 当前正在访问的表名或临时表的别名。
partitions 查询使用了哪些分区(如果表是分区表)。
type 连接类型,反映了表访问方式,性能由好到差:system > const > eq_ref > ref > range > index > ALL
possible_keys 查询可能使用到的索引列表。
key 实际使用到的索引名。NULL 表示没有使用索引。
key_len 索引使用的字节长度(可用于判断联合索引是否完全使用)。
ref 哪些列或常量被用于查找索引中的值。
rows MySQL 预计需要读取的行数。越小越好。
filtered 每行过滤后保留的百分比(估算值),用于多表连接。
Extra 额外信息,非常重要,显示如 Using index, Using where, Using temporary, Using filesort 等关键执行细节。

各列进一步说明

🔹 id

  • 唯一编号:越大越先执行。
  • 多表 join 时会有多个 id。

🔹 select_type

  • SIMPLE: 简单查询(无子查询或 UNION)
  • PRIMARY: 最外层查询
  • SUBQUERY: 出现在 SELECT/WHERE 中的子查询
  • DERIVED: 派生表(子查询的结果作为临时表)
  • UNION: UNION 中的第二部分及后续查询

🔹 type(访问类型)

访问表的方式,优化目标是越靠前越好:

type 含义(效率从高到低)
system 表只有一行(等同于 const)
const 常量引用(如主键查询)
eq_ref 唯一索引等值连接
ref 非唯一索引等值连接
range 索引范围扫描(如 BETWEEN, <, >
index 全索引扫描(无 WHERE 过滤)
ALL 全表扫描(最差,优化重点)

🔹 Extra(额外信息)

常见值:

  • Using index: 覆盖索引,避免回表
  • Using where: 使用了 WHERE 条件过滤
  • Using temporary: 使用临时表(通常是 group by/order by 引起)
  • Using filesort: 需要额外排序(不是通过索引排序)
  • Using join buffer: 使用连接缓存(Nested Loop)

详细解释:
Using filesort: 本次查询语句中有order by,且排序依照的字段不在本次使用的索引中,不能自然有序。需要进行额外的排序工作。
Using index: 使用了覆盖索引——即本次查询所需的所有信息字段都可以从利用的索引上取得。无需回表,额外去主索引上去数据。
Using index condition: 使用了索引下推技术ICP。(虽然本次查询所需的数据,不能从利用的索引上完全取得,还是需要回表去主索引获取。但在回表前,充分利用索引中的字段,根据where条件进行过滤。提前排除了不符合查询条件的列。这样就减少了回表的次数,提高了效率。)
Using where: 表示本次查询要进行筛选过滤

posted @ 2025-07-23 14:44  兔麻吕  阅读(12)  评论(0)    收藏  举报