Type 列
访问类型——就是 MySQL 决定如何查找表中的行。
下面是最重要的访问方法,依次从最差到最优
ALL
这就是人们所称的全表扫描,通常意味着 MySQL 必须扫描整张表,从头到尾,去找到需要的行。(这里也有个例外,例如在查询里是用来 LIMIT,或者在 Extra 列中显示 “Using distinct/not exists”。)
index
这个跟全表扫描一样,只是 MySQL 扫描表时按索引次序进行而不是行。它的主要优点是避免了排序;最大的缺点是要承担按索引次序读取整个表的开销。这通常意味着若是按随机次序访问行,开销将会非常大。
如果在 Extra 列中看到 “Using index”,说明 MySQL 正在使用覆盖索引,它只扫描索引的数据,而不是按索引次序的每一行。它比按索引次序全表扫描的开销要少很多。
range
范围扫描就是一个有限制的索引扫描,它开始于索引里的某一点,返回匹配这个值域的行。这比全索引扫描好一些,因为它用不着遍历全部索引。显而易见的返回扫描是带有 BETWEEN 或在 WHERE 子句里带有 > 的查询。
当 MySQL 使用索引去查找一系列值时,例如 IN() 和 OR 列表,也会显示为范围扫描。然后,这两者其实是相当不同的访问类型,在性能上有重要差异。
此类扫描的开销跟索引类型相当。
ref
这是一种索引访问(有时也叫做索引查找),它返回所有匹配某个单个值的行。然而,它可能会找到多个符合条件的行,因此,它是查找和扫描的混合体。此类索引访问只有当使用非唯一性索引或者唯一性索引的非唯一性前缀时才会发生。把它叫做 ref 是因为索引要跟某个参考值相比较。这个参考值或者是一个常数,或者是来自多表查询前一个表里的结果值。
ref_or_null 是 ref 之上的一个变体,它意味着 MySQL 必须在初次查找的结果里进行第二次查找以找出 NULLL 条目。
eq_ref
使用这种索引查找,MySQL 知道最多只返回一条符合条件的记录。这种访问方法可以在 MySQL 使用主键或者唯一性索引查找时看到,它会将他们与某个参考值做笔记。MySQL 对于这类访问类型的优化做的非常好,因为它知道无需估计匹配行的范围或在找到匹配行后再继续查找。
const, system
当 MySQL 能对查询的某部分进行优化并将其转换成一个常量时,它就会使用这些访问类型。举例来说,如果你通过将某一行的主键放入 WHERE 子句的方式来选取此行的主键,MySQL 就能把这个查询转换为一个常量。然后就可以高效地将表从连接执行中移除。
NULL
这种访问方式意味着 MySQL 能在优化节点分解查询语句,在执行阶段甚至用不着再访问表或者索引。例如,从一个索引列里选取最小值可以通过单独查找索引来完成,不需要在执行时访问表。