mysql的Extra的4个属性Using index UsingWhere 和Index Condition Pushdown

mysql 可分为两层server层和存储引擎层,server层又包括:连接器,解析器,优化器,执行器四个重要的层次。。
回表是从server层再次访问存储引擎的过程。使用索引在查询的时候存储引擎返回到server层的数据是整个索引的关键字,如果用户要的数据字段就是索引的字段,即覆盖了,Extra的字段就会有Using Index,表示不需要回表了。但是即使存储引擎返回的数据在server层也会有可能被再次被server层过滤再返回给用户,根据是否server层进行过滤Extra会有无Using where,如果覆盖了并且server 还过滤了,就会有Using Index Using where;
看下图:
score表已有索引(s_id, c_id在这里插入图片描述
返回Using Index,server层没有过滤在这里插入图片描述
返回Using index; Using where(注意:like语句不会启动索引的,普通索引不会用于模糊查询)
在这里插入图片描述
返回Using where 说明用户要的字段不完全覆盖,server层要进行过滤,
在这里插入图片描述
注意:没有索引的动用都是using where
在这里插入图片描述

最难的索引下推(index Condition pushdown)简称ICP(不懂,后补,网上说的也是瞎吹,根本就不会显示Using index Condition)

首先他是一个执行引擎的概念,不是server层,是一个优化的手段。

mysql5.6+以后默认是启动整个优化手段的,他在以下的条件成立时会自动启动:
1.只能用于二级索引(secondary index)

explain显示的执行计划中type值

(join 类型)为range、 ref、 eq_ref或者ref_or_null。

2.**且查询需要访问表的整行数据,**即不能直接通过二级索引的元组数据获得查询结果(索引覆盖)。

对于InnnoDB表,ICP仅用于二级索引。(ICP的目的是减少全行读取的次数,从而减少IO操作),对于innodb聚集索引,完整的记录已被读入到innodb缓冲区,在这种情况下,ICP不会减少io。
下图什么也没显示,不知为什么,可能就是Using index Condition
ICP可以减少存储引擎层返回需要被index filter过滤掉的行记录,省去了存储引擎访问基表的次数以及MySQL服务器访问存储引擎的次数。

使用ICP前后存储引擎工作的区别参考

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值