Explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。
type字段含义
type字段说明了查询语句的关联类型,更准确的说法是访问类型
–换言之就是Mysql决定如何查找表中的行。
下面是最重要的访问方法,依次从差到最优: All -> Index -> range -> ref -> eq_ref -> const,system -> null
ALL
全表扫描,意味着Mysql必须扫描整张表的数据去找到需要的行。(使用LIMIT例外)
Index
这个跟全表扫描一样,只是Mysql扫描表时按照索引次序
进行而不是行。主要优点是避免了排序。最大缺点是需要承担按照索引次序读取整个表的开销。这通常意味着若是按照随机次序访问行,开销将非常大。
如果在extra列中看到"Using index",说明Mysql 正在使用覆盖索引
,它只扫描索引的数据,而不是按索引次序的每一行。它比按索引次序全表扫描的开销要少很多。
Range
范围扫描就是一个有限制的索引扫描,开始于索引的某一点,返回匹配这个值域的行。范围扫描是带有between或子句里面带有<>的查询。
此类扫描的开销跟索引类型相当,只是扫描的行记录少。
ref
这是一种索引访问(有时也叫做索引查找),它返回所有匹配某个单个值的行。然而,它可能找到多个符合条件的行,因此它是查找和扫描的混合体。
此类型索引只有当使用非唯一索引才会发生,把他叫做ref是因为索引要跟某个参考值比较。
eq_ref
使用这种索引查找,Mysql知道最多只返回一条符合条件的记录。这种访问可以在使用主键或者唯一性所有查找时看到。
const, system
当Mysql能对查询的部分进行优化并将其转换成一个常量时,它就会使用这种访问类型。
例如:通过将某一行的主键放入WHERE子句来选取此行的主键,Mysql能把这个查询转换成一个常量。
NULL
这种访问方式意味着Mysql能在优化阶段分解查询语句,在执行阶段甚至用不着再访问表或者索引。
例如从一个索引列里面选取最小值可以通过单独查找索引来完成,不需要在执行时访问表。