暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

怎么理解mysql中索引下推(Index Condition Pushdown)

2019

在mysql中,我们有时候会看到索引下推的概念,那么怎么理解它呢?下面一起来看下吧。

索引下推

索引下推,原意为Index condition pushdown,简称icp,即索引条件下推。这里面比较关键的一点就是怎么理解下推

我们知道mysql的架构体系里服务端分为上层的server层和下层的引擎层,下推的意思其实就是把原来由server层执行的where条件过滤的逻辑下推
到了引擎层处理。

展开来说,就是我们知道复合索引有个最左匹配的规则,在进行索引扫描的时候,只会根据索引的前导列进行扫描。

举个例子,比如一个表在a、b、c三个字段上建立了复合索引idx_test(a,b,c),在查询的时候where条件中指定了a=1 并且c=2,这个时候c这个字段是用不到的。

在关闭ipc的情况下,sql执行的流程会如下图所示:

图片来源于:https://zhuanlan.zhihu.com/p/73035620?utm_source=wechat_session&utm_medium=social&s_r=0

(注:原博讲的很好,强烈推荐。)

根据c=2的条件过滤的部分会在server层的using where
进行。

而在开启icp的情况下,sql的执行过程,会如下图所示:

在存储引擎层,进行了索引扫描之后,回表查询之前,又增加了一步:using index condition
。这部分就是在进行c=2的过滤。

总结一下就是说:

在没有ICP前,由于优化器只能使用前缀索引来过滤满足条件的查询,有了ICP,存储引擎在回表前,会继续检查满足其他索引字段的记录。这样做,既少了回表的次数,也减少了存储引擎返回给server层的行数,提高了查询性能。

关闭/打开索引下推

使用如下命令关闭/打开索引下推

SET optimizer_switch = 'index_condition_pushdown=off'; //关闭
SET optimizer_switch = 'index_condition_pushdown=on';  //开启

我们还可以通过执行计划,查看语句是否用到了索引下推。

关注explain结果的extra列,如果其中包含Using index condition;
,则说明用到了索引下推。


总结

索引下推,Index condition pushdown,简称icp,即索引条件下推。含义是把原来由server层执行的where条件过滤的部分下推
到了引擎层处理。索引下推既极少了回表的次数,也减少了存储引擎返回给server层的行数,提高了查询性能。



参考:https://zhuanlan.zhihu.com/p/73035620?utm_source=wechat_session&utm_medium=social&s_r=0 https://mariadb.com/kb/en/index-condition-pushdown/ https://www.cnblogs.com/zhoujinyi/archive/2013/04/16/3016223.html



点个“赞 or 在看” 你最好看!


喜欢,就关注我吧!




👇👇👇 咔片谢谢各位老板啦!!!

文章转载自PostgreSQL运维技术,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论