Explain执行器名词解释
Explain作用及使用
-
作用
复杂sql语句的读取顺序 sql中有哪些索引可以使用 sql中哪些索引被实际使用 表之间的引用 每张表有多少行被优化器查询
-
使用方法
EXPLAIN + 查询sql 如:EXPLAIN SELECT * FROM test_index;
-
基本字段解读
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | test_index | NULL | index | NULL | index_abc | 3069 | NULL | 9 | 100 | Using index |
编号 | 查询类型 | 表 | 匹配的分区 | 类型 | 可用索引 | 实际使用索引 | 实际索引长度 | 表之间引用 | 行数 | 按表条件过滤的行百分比 | 执行情况描述 |
Explain字段详解
id
select查询的序列号,并不是单纯的从上到下或者从下向上执行,共有三种情况
- id相同:按照从上到下的顺序执行
- id不同:按照id值由大到小的顺序执行
- id既有相同又有不同:先执行id值大的,然后相同值的从上到下执行
select_type
分别用来表示查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询。
值如下:
- SIMPLE:简单查询,不包含子查询和UNION查询
- PRIMARY:主查询,如包含子查询的sql中的父查询
- SUBQUERY:查询sql中的子查询
- DERIVED:衍生查询(在from列表中的子查询,Mysql递归这些子查询,结果放到临时表中)
- UNION:联合查询,t1 UNION t2 中的t2
- UNION RESULT:从UNION表获取结果的SELECT
table
一般指查询的表,对于带尖括号的,表示select_type + id的指向。
partitions
如果查询是基于分区表的话,会显示查询将访问的分区。
type
type所显示的是查询使用了哪种类型
查询速度:null > syetem > const > eq_ref > ref > range > index > all
- null:甚至不需要访问索引表,例如主键作为条件超过当前表主键最大值;
- system:const的特殊情况,只有一条数据的系统表
- const:使用唯一索引等价查询,仅能匹配到一条数据
- eq_ref:使用唯一索引作为关联条件,匹配多条不重复数据
- ref:普通索引等价
- range:检索给定范围的索引 , > 、< 、>= 、<=、between and
- index:仅查询索引表
- all:遍历全表以找到匹配的行
possible_keys
显示可能应用在这张表中的索引,一个或多个。查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用
key
查询中实际使用到的索引,小于等于possible_keys
key_len
表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度,在不损失精确性的情况下,长度越短越好。
key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的。
ref
表示查询中的连接匹配条件,即哪些列或常量被用于查找索引列上的值
rows
根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数,也就是说,用的越少越好
filtered
按表条件过滤的行百分比
Extra
查询结果的备注信息,很重要
Using index:性能提升,索引覆盖,此查询仅查询索引不需要回表查询
Using where:该查询中使用了where条件过滤
Using index, Using where:双条件,表明索引被用来执行索引键值的查找
Using filesort:性能消耗大,需要额外一次排序(查询)
Using temporary:性能消耗大,用到临时表,常见于order by和group by
Using join buffer 连接缓存
impossible where:where子句的值总是false,不能用来获取任何元组
distinct:优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作