索引覆盖与索引下推个人浅显的理解

索引覆盖与索引下推

在日常开发中经常使用sql但是很少意识到这个名词,其实做了一些时间的Coder都会注意这些习惯之后也就认为理所当然,但是对于这些名词总是关注不够造成面试碰壁,今儿就被问到了这两个技术名词弄的我一脸懵逼,说出去10多年开发真是白干了,捂脸!

索引覆盖

这里说的覆盖是通过索引来覆盖原始数据,也就是要查询的列被索引包含,那么Mysql在执行查询的时候会直接将索引中的数据通过存储引擎返回给server,不需要再进行回表获取其他列的数据,举个例子:

select id,user_name from user_info where user_name='hanmeimei';

user_info表对user_name添加了索引,那么在数据库存储引擎中就会维护着一颗根据user_name的B+Tree,根节点中储存着这条数据对应的id跟key值(user_name),由于查询结果只需要这两个字段因此存储引擎直接返回结果,不进行任何其他操作例如比较、回表等等。

如果我们把sql修改下

select id,user_name,age from user_info where user_name='hanmeimei';

当查询列多出了age字段时,索引中的数据显然无法满足查询结果,因此存储引擎根据user_name索引获取到根节点数据后,会根据根节点中存储的id到聚簇索引中获取整条数据信息,然后再返回给请求方。

索引下推

这个概念其实说出来都觉得可笑,觉得不应该如此么,但是mysql低版本就是挺可笑。
在mysql5.6之前是没有这个概念的,我们用一个sql来举例

select id,user_name,age from user_info where user_name='hanmeimei' and age>20;

我们在user_name,age都创建了索引,那么一般想法都是存储引擎会先找到user_name=‘hanmeimei’,然后找到age=20再进行范围索引,可是在mysql5.6之前他还真不是这么干的,他会先找到user_name='hanmeimei’的第一条记录,然后根据根节点中的id回表查询出完整数据然后交给server进行判断如果age<=20那么就丢弃,然后根节点是双向链表他就继续找下一条,然后再去回表如此往复,直到下一条user_name!='hanmeimei’结束。这个效率可想而知。
mysql5.6开始有了索引下推,他做的事儿其实就是咱们想象中他该干的事儿,存储引擎找到user_name后直接判断age,不进行回表也不用去server去判断,直到把所有结果都拿到后返回。

以后开发中还是需要特别注意些自己认为理所当然的事儿,其实这些事儿多看看可以更深入的帮我们理解他周边关联的一些问题,也可以更好的面对面试(重点)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值