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
全表扫描,性能最差。