什么是索引下降?
“索引”(index condition pushdown )简称ICP,用于在Mysql5.6版本中优化查询。
如果不使用ICP,当使用非主键索引(也称为常规索引或辅助索引)进行查询时,存储引擎会从索引中检索数据并将其返回给MySQL服务器,条件是数据是必需的
使用ICP时,如果存在已索引列的确定条件,MySQL服务器会将部分确定条件传递给存储引擎,存储引擎通过确定索引是否满足MySQL服务器传递的条件来索引
通过优化索引,可以减少存储引擎查询基础表的次数,以及MySQL服务器从存储引擎接收数据的次数。
斩钉截铁
开始之前准备用户表(user )。 主要字段为id、name、age和address。 创建合并索引(name,age )。
假设有一个需求,需要匹配名称开头为陈的所有用户。 sql语句应类似于以下内容:
SELECT* fromuserwherenamelike '陈% '基于“最佳左前缀”原则,这里使用连接索引(name,age )进行查询。 毫无疑问,它的性能高于全表扫描。
发生了问题。 如果有其他条件呢? 假设还有一个需求,要求名字的第一个字母是陈,与年龄为20岁的用户匹配。 此时的sql语句如下所示。
如何执行名为SELECT* fromuserwherenamelike '陈%'andage=20的sql语句? 分析Mysql5.6之前的版本和更高版本。
1.Mysql5.6之前的版本
在5.6之前的版本中,没有“下推索引”优化,因此执行了如下图所示的过程。
忽略名为age的字段,直接用name进行查询。 在(name,age )这个树中,两个结果发现各自的id为2,1。 然后,该过程需要回表两次,因为它一次返回一个具有检索到的id值的表查询。
2.Mysql5.6及之后版本
5.6版中添加了一个名为“索引下移”的优化,并执行了如下图所示的流程。
InnoDB并不忽视age这个字段,而是在索引内部判断age是否等于20,对于不等于20的记录直接跳过,所以在名为name,age]的索引树中为一个记录此时,带着这个id返回主键索引树,检查所有数据。 此过程只需回表一次。
3.实践
当然上述分析是原理性的,我们来实战性分析一下吧。 因此,我们在薄弱的画板上安装了Mysql 5.6版的MySQL,并对上述语句进行了分析。 下图:
根据explain的分析结果,Extra的值为Using index condition,表示使用了索引下拉菜单。
总结
将索引推送到非主键索引的优化可以有效地减少返回表的次数,大大提高查询的效率。
要关闭索引下移,请使用以下命令: 不说明配置文件的更改。 为什么这么好的功能关闭了呢?
set optimizer _ switch=' index _ condition _ push down=off '; 小道消息
最近发表的文章收到了很多读者的反馈,为了方便大家一起学习交流,弱小的画板建立了技术交流群,感兴趣的朋友可以参加一下
过去的推荐
Mysql性能优化:为什么要覆盖索引?
SQL查询语句是如何执行的?
SpringCloud 2020新视频发行版
幂等性如何实现? 带你去解开一波!
靓靓,集成SpringBoot还在找配置吗? 老司机会告诉你的!
老司机带你谈谈接口限制!
Spring解决了循环依赖。 你真的明白了吗?
老司机会带你从源代码进入Spring生命周期!