在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 在看” 你最好看!

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




