mysql 执行计划extra_mysql之执行计划——explain中的extra详解

之前一直对explain中的extra和type两个类型混淆。其实两者完全不同,type列和覆盖索引毫无关系,它只是表示这个查询访问数据的方式,或者说是MySQL查询行的方式。

我们使用一个例子来讲解这个extra列。下面的例子来自:https://blog..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;语句来显示刚刚创建的表中的索引情况:

6773e24f743c61244441f5deb6cd5b5a.png

1. 第一种情况

mysql 执行计划extra_mysql之执行计划——explain中的extra详解_第1张图片

这三个执行计划,extra字段的值是using index,意思是索引覆盖,查询的内容可以直接在索引中拿到。

2. 第二种情况

mysql 执行计划extra_mysql之执行计划——explain中的extra详解_第2张图片

第一个查询语句的type使用ref,是因为匹配索引的最左前缀。extra为null,是因为什么?????????难道是因为直接使用索引就可以查询出来的原因吗???这里我没搞懂。。。

da34a6c4bfc43d83fc32fde4900314c7.png

第二个查询语句的type使用All,是因为不符合最左前缀的理论,从而使用全盘扫描的方式查询数据,而extra的值是using where是因为,使用where来过滤条件。

3. 第三种情况

mysql 执行计划extra_mysql之执行计划——explain中的extra详解_第3张图片

查询的内容在索引内,where条件符合索引最左前缀,extra是using where using index, 且type是ref,表面用了索引,索引覆盖了查询,using where表示发生了过滤

4. 第四种情况

mysql 执行计划extra_mysql之执行计划——explain中的extra详解_第4张图片

查询的内容不再索引内,where条件为索引最左前缀,extra为null, type为ref,表明虽然用到了索引,但是没有索引覆盖,产生了回表。???回表问题需要搞一下。。。

你可能感兴趣的:(mysql,执行计划extra)