
explain就是看一下优化器生成的执行计划,主要可以看到:
表的读取顺序
数据读取操作的操作类型
哪些索引可以被使用
哪些索引真正被使用
表的直接引用
每张表的有多少行被优化器查询了
具体用法:
-- 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 filesort 和 Using temporary,可以通过调整查询语句、增加索引或优化表结构来消除这些性能瓶颈 | | |
id | 查询块编号。通常 id 越大越先执行(子查询常见) | | |
select_type | 查询类型,它描述了查询中每个 SELECT 子句的性质。常见的 select_type 值包括: | | |
table | 访问的表的名称或别名。如果查询涉及多个表,EXPLAIN 会显示它们的连接顺序 | | |
possible_keys | 可能可用的索引 | | |
key_len | key_len 列表示 MySQL 使用的索引长度。该值是由索引的定义和查询条件决定的。
优化建议:key_len 越小,查询越高效。在组合索引中,确保最常用的查询条件出现在索引的前缀部分,以减少 key_len 的长度。 | | |
ref | 与索引列比较的对象(常量/列) | | |
filtered | filtered 列表示在索引过滤之后,返回的记录占扫描到的总记录数的百分比。filtered 值越高,说明筛选条件越严格,数据过滤越充分。
优化建议:尽量提高 filtered 的比例,减少返回的无效数据。 | | |