(1)回顾:
type是非常关键的,直接决定了对某个表是如何查询数据的,包括了const,ref,range,index,all 这几种方式,分别根据主键/唯一索引,根据二级索引查询,对二级索引进行全索引扫描,对聚簇索引进行全表扫描。
(2)type类型解释:
首先 SQL 语句 : select from t1 where id=110 这样的SQL直接根据主键匹配查询,执行计划里的type是const,极为快捷,性能几乎是线性的。
接下来再看一个SQL语句:EXPLAIN SELECT FROM t1 INNER JOIN t2 ON t1.id=t2.id
我们看看这个SQL的执行计划:
(ref:就是使用某个字段的索引进行等值匹配搜索的时候,跟索引列进行等值匹配的那个目标值的一些信息)
(t2的主键索引进行等值匹配搜索,跟t2主键进行等值匹配的是 test_db.t1.id)
+----+-------------+-------+------------+--------+---------------+---------+---------+-----------------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+--------+---------------+---------+---------+-----------------+------+----------+-------+
| 1 | SIMPLE | t1 | NULL | ALL | PRIMARY | NULL | NULL | NULL | 3467 | 100.00 | NULL |
+----+-------------+-------+------------+--------+---------------+---------+---------+-----------------+------+----------+-------+
| 1 | SIMPLE | t2 | NULL | eq_ref | PRIMARY | PRIMARY | 10 | test_db.t1.id | 1 | 100.00 | NULL |
+----+-------------+-------+------------+--------+---------------+---------+---------+-----------------+------+----------+-------+
在这个执行计划里,会发现针对t1表是一个全表扫描,这个是必然的,因为关联的时候会先查询一个驱动表,这里就是t1,没有什么 where 筛选条件,自然只能全表扫描查出来所有数据了。
然后是t2表的查询type是eq_ref,而且使用了PRIMARY主键,这个意思是针对 t1表全表扫描获取到的每条数据,都会基于t2表里基于主键进行等值匹配,此时会在t2表的聚簇索引里根据主键进行快速查找,所以在连接查询时,针对被驱动表如果基于 主键 进行等值匹配,那么他的查询方式就是eq_ref了。
如果是正常基于某个二级索引进行等值匹配的时候,type就会是ref,而如果基于二级索引查询的时候允许值为null,那么查询方式就是 ref_or_null<br />另外之前说的,有一些特殊场景下针对单表查询可能会基于多个索引提取数据后合并,此时查询方式是**index_merge**这种。而查询方式range的话就是基于二级索引进行范围查询,查询方式是index的时候就是直接扫描二级索引叶子节点,就是扫描二级索引的每条数据,最后如果是all的话,就是全表扫描,也就是聚簇索引的叶子节点扫描每条数据。