之前一直对explain中的extra和type两个类型混淆。其实两者完全不同,type列和覆盖索引毫无关系,它只是表示这个查询访问数据的方式,或者说是MySQL查询行的方式。
我们使用一个例子来讲解这个extra列。下面的例子来自:https://blog.csdn.net/jeffrey11223/article/details/79100761
首先我们创建一个表
CREATE TABLE test_extra (
xxx varchar(20) NOT NULL,
yyy varchar(20) NOT NULL,
zzz datetime NOT NULL,
aaa varchar(10) NOT NULL,
PRIMARY KEY (xxx,yyy,zzz)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
通过show index from test_extra;
语句来显示刚刚创建的表中的索引情况:
1. 第一种情况
这三个执行计划,extra字段的值是using index,意思是索引覆盖,查询的内容可以直接在索引中拿到。
2. 第二种情况
第一个查询语句的type使用ref,是因为匹配索引的最左前缀。extra为null,是因为什么?????????难道是因为直接使用索引就可以查询出来的原因吗???这里我没搞懂。。。
第二个查询语句的type使用All,是因为不符合最左前缀的理论,从而使用全盘扫描的方式查询数据,而extra的值是using where是因为,使用where来过滤条件。
3. 第三种情况
查询的内容在索引内,where条件符合索引最左前缀,extra是using where using index, 且type是ref,表面用了索引,索引覆盖了查询,using where表示发生了过滤
4. 第四种情况
查询的内容不再索引内,where条件为索引最左前缀,extra为null, type为ref,表明虽然用到了索引,但是没有索引覆盖,产生了回表。???回表问题需要搞一下。。。