explain参数之type

Type字段是最重要的字段之一,显示查询使用了何种类型。从最好到最差的连接类型为:system,const,eq_ref,ref,fulltext,ref_or_null,index_merge,unique_subquery,index_subquery,range,index,all。

(1)System

表中只有一行数据或者空表,这是const类型的一个特例。且只能用于myisam和memory表。如果是innoDB引擎表,type列在这个情况下通常是all或者index。

(2)Const

最多只有一行记录匹配。当联合主键或唯一索引的所有字段跟常量值比较时,join类型为const。其他数据库也叫做唯一索引扫描。

(3)Eq_ref

多表join时,对于来自前面的每一张行,在当前表中只能找到一行。这可能是除了system和const之外最好的类型。当主键或唯一非null索引的所有字段都被用作join联接时会使用此类型。

Eq_ref可用于使用“=”操作符比较的索引列。比较的值可以是常量,而ref使用的是非唯一索引或者普通索引。

相对于ref的区别就是它使用的唯一索引,即主键或唯一索引,而ref使用的是非唯一索引或者普通索引。

Eq_ref只能找到一行,而ref能够找到多行。

(4)Ref

对于来自前面表的每一行,在此表的索引中可以匹配到多行。若联接只用到索引的最左前缀或索引不是主键或唯一索引时,使用ref类型。也就是说,此联接能匹配到多行记录。Ref可用于使用“=”或‘<=>’操作符作比较的索引列。

(5)Fulltext

使用全文索引的时候就是这个类型。需要注意,全文索引的优先级很高,若全文索引和普通索引同时存在,MySQL不管代价,优先使用全文索引。

(6)Ref_or_null

和ref类型类似,只是增加了null值的比较,实际应用的不多。

(7)Index_merge

表示查询使用了两个以上的索引,最后取交集或者并集,常见and、or的条件使用了不同的索引,官方排序这个在ref_or_null之后,但是实际上由于要读取多个索引,性能可能大部分时间不如range。

(8)Unique_subquery

用于where中的in形式子查询,子查询返回不重复唯一值,可以完全替换子查询,效率更高。该类型替换了下面形式的in子查询的ref:value in (select primary key from single_table where some_expr)

(9)Index_subquery

该联接类型类似于unique_subquery,适用于非唯一索引,可以返回重复值。

(10)Range

索引范围查询,常见于使用=,<>,>=,<,<=,is null,between,in()或者like等运算符的查询中。

(11)Index

索引全表扫描,把索引从头到尾扫一遍,包含两种情况:

一种是查询使用了覆盖索引,那么它只需要扫描索引就可以获取数据,这个效率要比全表扫描快,因为索引通常比数据表小,而且还能避免二次查询。在extra显示using index。反之,如果在索引上进行全表扫描,没有using index的提示。

(12)all

全表扫描,性能最差。

欢迎批评指正,提出问题,谢谢!
原文地址:https://www.cnblogs.com/xxeleanor/p/14995330.html