explain就是看一下优化器生成的执行计划,主要可以看到:

  1. 表的读取顺序

  2. 数据读取操作的操作类型

  3. 哪些索引可以被使用

  4. 哪些索引真正被使用

  5. 表的直接引用

  6. 每张表的有多少行被优化器查询了

具体用法:

-- 1) 基础版:看执行计划(不真正执行)
EXPLAIN SELECT ...;

-- 2) 可读性更好(树形)
EXPLAIN FORMAT=TREE SELECT ...;

-- 3) 真正执行并返回实际耗时(MySQL 8.0+)
EXPLAIN ANALYZE SELECT ...;

explain字段含义

字段

含义

type

访问方式,性能大致从好到差:system > const > eq_ref > ref > range > index > ALL

1. system:系统表,少量数据,往往不需要进行磁盘IO;

2. const:常量连接;

3. eq_ref:主键索引(primary key)或者非空唯一索引(unique not null)等值扫描;

4. ref:非主键非唯一索引等值扫描;

5. range:范围扫描;

6. index:索引树扫描;

7. ALL:全表扫描(full table scan);

key

实际使用的索引。NULL 表示没用索引

rows

预估要扫描的行数,越小越好

Extra

Extra 列包含查询优化器的额外信息。常见的值有:

  • Using where:表示查询使用了 WHERE 过滤条件。

  • Using index:表示查询只使用了索引,不需要回表查询数据。

  • Using filesort:表示查询需要额外的排序操作,这是一个性能瓶颈。

  • Using temporary:表示查询使用了临时表,这是一个性能瓶颈。

  • Using index condition:ICP,下推过滤,通常是优化

优化建议:尽量避免 Using filesortUsing temporary,可以通过调整查询语句、增加索引或优化表结构来消除这些性能瓶颈

id

查询块编号。通常 id 越大越先执行(子查询常见)

select_type

查询类型,它描述了查询中每个 SELECT 子句的性质。常见的 select_type 值包括:

  • SIMPLE:简单查询,不包含子查询或联合查询。

  • PRIMARY:主查询,是最外层的查询。

  • SUBQUERY:子查询,出现在 SELECTWHERE 子句中。

  • UNION:联合查询的一部分。

  • DEPENDENT SUBQUERY:依赖于外部查询的子查询。

  • DERIVED:派生表,即子查询中的临时表。

table

访问的表的名称或别名。如果查询涉及多个表,EXPLAIN 会显示它们的连接顺序

possible_keys

可能可用的索引

key_len

key_len 列表示 MySQL 使用的索引长度。该值是由索引的定义和查询条件决定的。

优化建议key_len 越小,查询越高效。在组合索引中,确保最常用的查询条件出现在索引的前缀部分,以减少 key_len 的长度。

ref

与索引列比较的对象(常量/列)

filtered

filtered 列表示在索引过滤之后,返回的记录占扫描到的总记录数的百分比。filtered 值越高,说明筛选条件越严格,数据过滤越充分。

优化建议:尽量提高 filtered 的比例,减少返回的无效数据。