MySQL的索引条件下推(index condition pushdown,ICP)

举报
JavaEdge 发表于 2022/10/13 21:58:00 2022/10/13
【摘要】 索引下推:不符合索引最左前缀原则,却还能利用复合索引的其他字段,减少回表次数。最左前缀可用于在索引中定位记录。那不符合最左前缀的部分,会怎样?用户表联合索引(name, age)为例,现在需检索表中“名字第一个字是张,且年龄是10的所有男孩”:select * from user where name like '张%' and age=10 and ismale=1;在搜索索引树时,只能用...

索引下推:不符合索引最左前缀原则,却还能利用复合索引的其他字段,减少回表次数。

最左前缀可用于在索引中定位记录。那不符合最左前缀的部分,会怎样?

用户表联合索引(name, age)为例,现在需检索表中“名字第一个字是张,且年龄是10的所有男孩”:

select * from user where name like '张%' and age=10 and ismale=1;

在搜索索引树时,只能用 “张”,找到第一个满足条件记录ID3。总比全表扫好。然后判断其他条件。

  • MySQL5.6前,只能从ID3开始,一个个回表,到主键索引上找数据行,再对比字段值
  • 5.6引入索引下推优化,在索引遍历过程中,对索引中包含的字段先做判断,直接过滤不满足条件的记录,减少回表次数

ICP是MySQL使用索引从表中检索行的场景优化:

  • 若无ICP,存储引擎会遍历索引,以在基本表中找到行,并将其返回给MySQL Server来评估行的where条件
  • 启用ICP,若能仅使用索引中的列来评估where条件的某些部分,MySQL Server会将此部分的where 条件下推向存储引擎。然后,存储引擎通过使用索引节点来评估推送的索引条件,并且仅当满足时,才是从表中读取的行。 ICP可减少存储引擎必须访问基本表的次数及MySQL Server必须访问存储引擎的次数

1 执行流程图

图里每个虚线箭头表示回表一次。

1.1 无索引下推

(name,age)索引里故意去掉age值,这过程InnoDB并不看age值,只按序把name第一个字是’张’的记录一条条取出来,并回表,共计回表4次。

1.2 索引下推

InnoDB在(name,age)索引内部就开始判断age是否等于10,对不等于10的记录,直接判断并跳过。这个例子中,只需对ID4、ID5这两条记录回表取数据判断,即只需回表2次。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。