explain查优
id :
Mysql query optimizer选定的执行计划中查询的序列号,表示查询中执行select子句获操作表的顺序,id值越大表示执行的优先级越高,越先被执行,若id相同,则从上之下依次执行
select_type :
simple:最简单的查询语句,不设计到其他的关联查询等。
primary:最外层的select查询
union:union中的第二个或随后的select查询,不依赖于外部查询的结果集
dependent union:union中的第二个或随后的select查询,依赖于外部查询的结果集
subquery:子查询中的第一个select查询,不依赖于外部查询的结果集
dependent subquery:子查询中的第一个select查询,依赖于外部查询的结果集
derived:用户from子句中有子查询的情况,mysql会递归执行这些子查询,把结果放在临时表中
uncacheable subquery:结果集不能被缓存的子查询,必须重新为外层查询的每一行进行评估
uncacheable union:union中的第二个或随后的select查询,数据不可缓存的子查询
table:
输出行所引用的表
type:
system:表仅有一行记录,是const中的一个特例(实际工作不存在)
const:const用于常数值比较primary key时,当查询的表仅有一行时,会出现system
eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配,常见于主键或唯一索引扫描
ref:非唯一性索引扫描,返回匹配某个参数的多行记录。
range:扫描部分索引,缩小索引的部分,始于索引的一端终于另一端,常适用于between..and.. < > in等
index:扫描全表,但扫描的是索引,非所有数据
all :扫描全表
possible_keys:
在扫描的时候,能使用的索引。
key:
在扫描的时候,使用到的索引。与
possible_keys
结合,有可能possible_keys存在,key存在,也有可能possible_keys不存在,key存在。也有可能key不存在,若possible_keys存在,key不存在,需检查索引是否失效
key_len:
使用的索引的字节长度,在精度不受影响的情况下,长度越小越好。
ref:
显示哪个字段或常数与key一起被使用。
rows:
表示这个数需要遍历多少行数据才能查询的到
Extra:
包含不适合在其他列中显示但十分重要的额外信息
Only index,这意味着信息只用索引树中的信息检索出的,这比扫描整个表要快。
using where是使用上了where限制,表示MySQL服务器在存储引擎受到记录后进行“后过滤”(Post-filter),如果查询未能使用索引,Using where的作用只是提醒我们MySQL将用where子句来过滤结果集。
impossible where 表示用不着where,一般就是没查出来啥。
Using filesort(MySQL中无法利用索引完成的排序操作称为“文件排序”)当我们试图对一个没有索引的字段进行排序时,就是filesoft。它跟文件没有任何关系,实际上是内部的一个快速排序。
Using temporary(表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询),使用filesort和temporary的话会很吃力,WHERE和ORDER BY的索引经常无法兼顾,如果按照WHERE来确定索引,那么在ORDER BY时,就必然会引起Using filesort,这就要看是先过滤再排序划算,还是先排序再过滤划算。