很多朋友在用mysql进行调优的时候都肯定会用到explain来看select语句的执行情况,这里简单介绍结果中两个列的含义。
1 type列
官方的说法,说这列表示的是“访问类型”,更通俗一点就是:mysql找到需要的数据行的方式。一下就是从效率最差到最好顺序分别介绍下:
All 这个就是所谓的全表扫描,没有用到任何的index,mysql就是从头到尾把整个表遍历一边,找到所需要的数据行。效率是最差的。如下图,这个表中的usertype不是索引,这个查询中没有用到任何索引,所以就出现了全表扫描的结果。
index type列中出现了index,含义仅仅是局限在扫描全表的顺序是按照索引顺序扫描的,仅仅是按索引顺序去扫描的。它的有点是避免了排序,因为索引就是已经排序好的,缺点就是要承担按照索引次序读取整张表的开销。如下,这个查询中order by id,id是这个表的索引,但是因为没有在where中出现任何的索引列,所以它也只是索引顺去扫描了全表。(这里强调一下,你的查询语句中where条件中没有索引,只是order by 的时候用了index,而且没有用limit限制,type这里显示的是all,也就是这种情况下没有limit,还是扫面全表的)
range 这个一般就是在你的where语句中出现了between或者“>”这种符号的时候会出现这个。这种范围扫描索引扫描比全表扫描要好,因为它只需要开始于索引的某一点,而结束语另一点,不用扫描全部索引。
ref 这也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体。
const,system 当mysql能对查询的部分就行优化,并且转换成一个常量的时候,它就会使用这种访问类型了。比如你把一行的主键当做where条件放进去,那mysql就可以把它转换成一个常量,然后查询。如下图:uid是主键,作为where条件就能出现这个效率最高的查询结果。
NULL是最好的,不用访问索引或表,直接获得数据。
2 extra列
extra列中出现的信息一般不是太重要,但是还是有很多信息我们可以从这里面获取到:
using index:出现这个说明mysql使用了覆盖索引,避免访问了表的数据行,效率不错!
using where:这说明服务器在存储引擎收到行后将进行过滤。有些where中的条件会有属于索引的列,当它读取使用索引的时候,就会被过滤,所以会出现有些where语句并没有在extra列中出现using where这么一个说明。
using temporary:这意味着mysql对查询结果进行排序的时候使用了一张临时表。
using filesort:这个说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。