MySql性能(5)—explain执行计划(type列详解)

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必须在初次查找的结果里进行第二次查找以找出NULL的条目。

eq_ref(索引查找-多表情况)

使用这种索引查找,Mysql知道最多只返回一条符合条件的记录。这种访问方法可以在MySQL使用主键或者唯一索引查找时看到,它会将它们与某个参考值做比较。MySQL对于这类访问类型的优化做得非常好,因为它知道无须估计匹配行的范围或在找到匹配行后在继续查找。这个适用场景是多表查询时,按照表的主键或唯一键联合查询。

const、system(索引查找-单表情况)

mysql对查询的某部分进行优化并将其转换成一个常量时,他会使用这些访问类型。举例说明,如果通过将某一行的主键放入WHERE字句里的方式来选取此行的主键,Mysql就能把这个查询转换为一个常量。然后就可以高效地将表从连接执行中移除。注意,这一般是单表中按主键或唯一键去读取。

NULL(无需扫描表)

这种访问方式意味着Mysql能在优化阶段分解查询语句,在执行阶段甚至用不着在访问表或索引。例如,从一个索引列中选取最小值可以通过单独查找索引来完成,不需要再执行时访问表。

历史文章

mybatis&&数据库优化&&缓存目录

文章参考

MySQL里explain中的const类型是什么概念,和eq_ref有什么区别。

高性能mysql第三版.pdf—百度云盘地址
提取码—sgmj

你可能感兴趣的:(MySql性能(5)—explain执行计划(type列详解))