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. 第一种情况

48ebea19116eb9c46b05a5615afc5a9e.png

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

2. 第二种情况

0ebb8dbd7e183d4210da304a508eeb30.png

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

da34a6c4bfc43d83fc32fde4900314c7.png

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

3. 第三种情况

61ca9c6a80e5a799d6d2f4abdabb63a1.png

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

4. 第四种情况

03bc99950d345fdd7582128930034ed1.png

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值