explain可以获取mysql如何执行select语句的信息,包括在select语句执行过程中表如何连接和连接的顺序。
explain默认以行显示结果,如果以 \G结尾表示以列显示结果。
结果包含:
id、 select_type、table、type、possible_keys、key、key_len、ref、rows、Extra
id:
select查询的序列号,包含一组数字,表示查询中执行select子句或者操作表的顺序,id相同,则执行顺序自上而下,id不同,则如果是子查询,id的序号会递增,id值越大,优先级越高,越优先执行。
select_type:
select_type表示select的类型,常见的有:
SIMPLE、PRIMARY、SUBQUERY、DERIVED、UNION、UNION RESULT
SIMPLE:简单的select查询,不包含子查询或者union。
PRIMARY:查询中如果包含任何复杂的子部分,最外层查询被标记为PRIMARY。
SUBQUERY:在select或者where列表中包含的子查询。
DERIVED:在from列表中包含的子查询被标记为DERIVED,mysql会递归执行这些子查询,把结果放在临时表里。
UNION:如果第二个select出现在union之后,则被标记为UNION,如果UNION包含在from子句的子查询中,外层select将被标记为DERIVED。
UNION RESULT:从UNION表获取结果的select。
table:
table表示输出结果的表。
type:
type表示mysql在表中找到所需要行的方式,或者叫访问类型。常见的有几种类型:
ALL < index < range < ref < eq_ref < const < system < null
ALL: 表示全表扫描。
index: 表示索引扫描,mysql会遍历整个索引来查询匹配的行。与ALL的区别是,index从索引中读取,ALL是全硬盘读取。
range:表示索引范围扫描,常见与> < >= <= between等。
ref: 表示使用非唯一索引扫描或唯一索引的前缀扫描,返回匹配某个单独值的记录行。
eq_ref:类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者unique index作为关联条件。
const、system:单表中最多有一个匹配行,这个匹配行中的其他列的值可以被优化器在当前查询中当作常量来处理。通过唯一索引访问的时候,类型为const,从仅有一条记录的表中检索时,类型为system。
null: mysql不用访问表或者索引,直接就能得到结果。
possible_keys:
possible_keys表示查询时可能使用的索引。
key:
key表示实际使用的索引。如果为null,表示没有使用索引,查询中若使用了覆盖索引,则该索引仅出现在key列表中。
key_len:
key_len表示使用到索引字段的长度。显示的值为索引字段的最大可能长度,不一定是实际使用长度。
ref:
ref表示显示所有额那一列被使用了。
rows:
rows表示扫描行的数量。
Extra:
Extra表示执行情况的其他说明。
Extra常用的信息:
using filesort、using temporary、using index、using where、using join buffer、impossible where
using filesort:说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取,mysql中无法利用索引完成的排序操作称为“文件排序”。
using temporary:使用了临时表保存中间结果。
using index:表示相应的select操作使用了覆盖索引,避免访问了表的数据行,如果同时出现using where,表明索引被用来执行索引键值的查找,如果同时没有出现using where,表明索引用来读取数据而非执行查找。
using where:使用了where过滤。
using join buffer:使用了连接缓存。
impossible where:where子句的值返回false。