MySQL Explain
2020-03-31 本文已影响0人
lc_666
结果详解
共有10列:id,select_type,table,type,partitions,possible_keys,key,key_len,ref,rows,filtered,Extra
id
SQL执行的顺序:
- id相同时,执行顺序由上而下;
- 如果是子查询,id号会递增,id值越大越先执行;
- id相同,则按顺序由上到下执行;
select_type
显示每个select语句查询的类型:
-
SIMPLE
:简单的查询语句,没有使用UNION
或者子查询; -
PRIMARY
:最外层的SELECT
; -
UNION
:第二个或者之后的查询使用了UNION
; -
DEPENDENT UNION
:UNION语句中的第二个SELECT,依赖于外部子查询; -
UNION RESULT
:联合查询的结果; -
SUBQUERY
:子查询的第一个SELECT
; -
DEPENDENT SUBQUERY
:子查询的第一个查询,依赖于外部的查询; -
DERIVED
:派生表(从SELECT
语句返回的虚拟表,类似于临时表,派生表和子查询通常可以互换); -
DEPENDENT DERIVED
:依赖于外部子查询的派生表; -
METERIALIZED
:??? -
UNCACHEABLE SUBQUERY
:不可缓存的子查询,必须为外部查询的每一行重新计算; -
UNCACHEABLE UNION
:第二个或者之后的子查询属于一个不可缓存子查询;
table
输出行引用的表名称,也可能是以下值:
-
<unionM,N>
:id值为M和id值为N的并集; -
<derivedN>
:该行是指用于与该行的派生表结果id的值 N; -
<subqueryN>
:返回id为N的物化的子查询的结果;
type
访问方式
常用的类型有: system, const, eq_ref, ref, fulltext、ref_or_null、 range, index, ALL
(从左到右,性能从差到好)
-
system
:表只有一行(=system table
),是const
join type的一个特例; -
const
:表中只有一个匹配行,并且在查询的开始被读取,因为只被读取一次,所以非常快; -
eq_ref
:根据前一个查询计划结果表中的行,关联读取当前表中的一行,实际取的是上一个表条件结果行中的主键或唯一非空索引列做为条件来关联当前表,即上一个表查询的是常量值或非空唯一值; -
ref
:为前一个表中的行,在当前表中读取所有能匹配索引值的行。如果联接仅使用最左前缀索引,或者使用的不是主键或唯一索引(即联接无法基于索引选择单行),则使用 ref 联连类型。如果所使用的索引只匹配几行,这是一种较好的联接类型。该类型可用于使用 = 或 <=> 运算行比较的索引列; -
fulltext
:使用全文索引 FULLTEXT 执行联接; -
ref_or_null
:ref
+NULL
; -
index_merge
:该类型说明使用索引合并优化; -
unique_subquery
:在带有IN
的子查询中代替eq_ref
; -
index_subquery
:在IN
子查询中取代非唯一索引; -
range
:根据索引查询一定范围内的值; -
index
:与ALL
类型相同,但只扫描索引树; -
ALL
:全表扫描;
partitions
查询所匹配的记录所在的分区,没有分区则显 NULL
。
possible_keys
查询中可能会使用到的索引;
key
使用到的索引;
key_len
实际使用的索引的长度;
ref
显示与索引列进行比较的常量或列;
rows
MySQL 认为执行查询必须检查的行数,对于使用Innodb
则是一个估算,并不是准确的值;
filtered
按条件过滤的表行的估算百分比。最大值为 100,表示没有进行过滤就可以直接找到具体的行(如主键或唯一索引),值越小,表示过滤(查询)的行数越多;
Extra
附加信息
-
Using filesort
:当查询中包含排序,但无法利用索引排序时,mysql优化器会使用相应的算法来实现排序,数据较少使用内存排序,否则使用磁盘排序; -
Using temporary
:为了获取查询结果需要创建一个临时表来保存查询结果;如果查询包含不同列的group by
和order by
会发生这样的情况; -
Using index
:仅使用索引树中的信息从表中检索列信息;