图解索引下推

大家好,我是大彬~

今天给大家分享MySQL的索引下推。

什么是索引下推

索引条件下推,也叫索引下推,英文全称Index Condition Pushdown,简称ICP。

索引下推是MySQL5.6新添加的特性,用于优化数据的查询。

在MySQL5.6之前,通过使用非主键索引进行查询的时候,存储引擎通过索引查询数据,然后将结果返回给MySQL server层,在server层判断是否符合条件

在MySQL5.6及以上版本,可以使用索引下推的特性。当存在索引的列做为判断条件时,MySQL server将这一部分判断条件传递给存储引擎,然后存储引擎会筛选出符合MySQL server传递条件的索引项,即在存储引擎层根据索引条件过滤掉不符合条件的索引项,然后回表查询得到结果,将结果返回给MySQL server。

可以看到,有了索引下推的优化,在满足一定的条件下,存储引擎层会在回表查询之前对数据进行过滤,可以减少存储引擎回表查询的次数

举个例子

假设有一张用户信息表user_info,有三个字段name, level, weapon(装备),建立联合索引(name, level),user_info表初始数据如下:

id name level weapon
1 大彬 1 键盘
2 盖聂 2 渊虹
3 卫庄 3 鲨齿
4 大铁锤 4 铁锤

假如需要匹配姓名第一个字为"大",并且level为1的用户,SQL语句如下:

SELECT * FROM user_info WHERE name LIKE "大%" AND level = 1;

那么这条SQL具体会怎么执行呢?

下面分情况进行分析。

先来看看MySQL5.6以前的版本

前面提到MySQL5.6以前的版本没有索引下推,其执行过程如下:

查询条件name LIKE不是等值匹配,根据最左匹配原则,在(name, level)索引树上只用到name去匹配,查找到两条记录(id为1和4),拿到这两条记录的id分别回表查询,然后将结果返回给MySQL server,在MySQL server层进行level字段的判断。整个过程需要回表2次

然后看看MySQL5.6及以上版本的执行过程,如下图。

相比5.6以前的版本,多了索引下推的优化,在索引遍历过程中,对索引中的字段先做判断,过滤掉不符合条件的索引项,也就是判断level是否等于1,level不为1则直接跳过。因此在(name, level)索引树只匹配一个记录,之后拿着此记录对应的id(id=1)回表查询全部数据,整个过程回表1次

可以使用explain查看是否使用索引下推,当Extra列的值为Using index condition,则表示使用了索引下推。

总结

从上面的例子可以看出,使用索引下推在某些场景下可以有效减少回表次数,从而提高查询效率。

码字不易,如果觉得对你有帮助,可以<stron>鼓励一下!</stron>

#Java开发##学习路径#
全部评论
楼主厉害,图画的也不错
点赞 回复 分享
发布于 2022-03-11 20:05

相关推荐

“我们搞的就是最前沿”上周四和周五主要在完成一个业务上的小需求,虽然最终也是完成了,但是周末也会担心:我这么久才完成这样一个简单的需求,是不是没体现出来什么能力,后续会不会让我一直干业务上的crud&nbsp;?其实我知道不管是哪个部门,即使是这种前沿的基础架构部门,也会有很多业务上的需求,并且这种业务需求的难度不在技术,我认为是在理解多年的老业务,有一些历史问题不问是搞不懂的。毕竟是第一段实习,即使让我干这种活我也是愿意的,毕竟每天都那么耐心的给我解答,正好这种也不用怎么学新的东西,做起来也轻松,可以在额外的时间包装一下这段实习。但是今天真的泪目了,早上10.30在工位正吃着早饭呢,突然收到一个下午两点半的会议邀请,后来知道这是一个mt新争取的一个大项目的初步技术研讨,全场五个人只有我一个新人,会上也特别照顾我,会时不时问我听没听懂,我提出的疑问也没人会觉得很低能,,,,最后还一直跟我强调:你压力不要太大,我们说到底还是探索,搞得就是最前沿,所以不要想有什么成果,有了那是运气好,没有是正常的。然后一天都在读开源文档,终于知道了学英文的重要性😢(这是真的)今天还有一个感悟,就是如果真的想搞科研也许在院校档次不那么高的情况下,也可以选择进企业搞。然后晚上吃完饭还和同事们去海边溜达了一圈,总之就是特别爽的一个周一。不知道我何德何能,在这里的每一天都感觉想给mt磕头我秋招是真的想继续留在鹅了,不知道我的理解对不对,各位大佬可以轻喷,我现在还是萌新在打怪升级阶段
秋招白月光
点赞 评论 收藏
分享
评论
3
18
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务