MySQL-01丨Explain分析SQL

Posted by jiefang on October 28, 2019

Explain分析SQL

Explain结果

列名 解释
id 查询编号
select_type 查询类型
table 涉及到的表
partitions 匹配的分区:查询将匹配记录所在分区。使用partitions使用时才显示。
type 本次查询的表连接类型
possible_keys 可能选择的索引
key 实际选择的索引
key_len 被选择的索引长度:用于判断联合索引有多少列被选择
ref 与索引比较的列
rows 预计需要扫描的行数,对于InnoDB来说,这个值是估值
filtered 按条件筛选行的百分比
Extra 附加信息

select_type

select_type的值 解释
SIMPLE 简单的SELECT语句(不包括UNION操作或子查询操作)
PRIMARY 两表做UNION或者存在子查询的外层的表操作为PRIMARY
UNION UNION操作中,查询中处于内层的SELECT
DEPENDENT UNION UNION 中的第二个或随后的 select 查询,依 赖于外部查询的结果集
UNION RESULT UNION操作的结果
SUBQUERY 子查询中首个SELECT
DEPENDENT SUBQUERY 子查询中首个SELECT,但依赖于外层的表
DERIVED 被驱动的SELECT子查询(子查询位于FROM子句)
MATERIALIZED 被物化的子查询
UNCACHEABLE SUBQUERY 对于外层的主表,子查询不可被物化,每次都需要计算(耗时操作)
UNCACHEABLE UNION UNION操作中,内层的不可被物化的子查询(类似于UNCACHEABLE SUBQUERY)

type

type的值 解释
system 查询对象表只有一行数据,且只能用于 MyISAM 和 Memory 引擎的表,这是最好的情况
const 基于主键或唯一索引查询,最多返回一条结果
eq_ref 表连接时基于主键或非 NULL 的唯一索引完成扫描
ref 基于普通索引的等值查询,或者表间等值连接
fulltext 全文检索
ref_or_null 表连接类型是 ref,但进行扫描的索引列中可能包含 NULL 值
index_merge 利用多个索引
unique_subquery 子查询中使用唯一索引
index_subquery 子查询中使用普通索引
index 全索引扫描
ALL 全表扫描

Extra

Extra 常见的值 解释 例子
Using filesort 将用外部排序而不是索引排序,数据较小时从内存排序,否则需要在磁盘完成排序 explain select * from t1 order bycreate_time;
Using temporary 需要创建一个临时表来存储结构,通常发生对没有索引的列进行 GROUPBY 时 explain select * from t1 group by create_time;
Using index 使用覆盖索引 explain select a from t1 where a=111;
Using where 使用 where 语句来处理结果 explain select * from t1 where create_time=‘2019-06-18 14:38:24’;
Impossible WHERE 对 where 子句判断的结果总是 false 而不能选择任何数据 explain select * from t1 where 1<0;
Using join buffer(Block Nested Loop) 关联查询中,被驱动表的关联字段没索引 explain select * from t1 straight_join t2 on (t1.create_time=t2.create_time);
Using index condition 先条件过滤索引,再查数据 explain select * from t1 where a >900 and a like “%9”;
Select tables optimized away 使用某些聚合函数(比如 max、min)来访问存在索引的某个字段是 explain select max(a) from t1;