太原网站制作哪家好,找建筑工程平台,哈尔滨关键词排名首页,中国建设银行官网站黄金部王毅导读 索引下推#xff08;index condition pushdown #xff09;简称ICP#xff0c;在Mysql5.6的版本上推出#xff0c;用于优化查询。 在不使用ICP的情况下#xff0c;在使用非主键索引#xff08;又叫普通索引或者二级索引#xff09;进行查询时#xff0c;存储引擎…导读 索引下推index condition pushdown 简称ICP在Mysql5.6的版本上推出用于优化查询。 在不使用ICP的情况下在使用非主键索引又叫普通索引或者二级索引进行查询时存储引擎通过索引检索到数据然后返回给MySQL服务器服务器然后判断数据是否符合条件 。 在使用ICP的情况下如果存在某些被索引的列的判断条件时MySQL服务器将这一部分判断条件传递给存储引擎然后由存储引擎通过判断索引是否符合MySQL服务器传递的条件只有当索引符合条件时才会将数据检索出来返回给MySQL服务器 。 索引条件下推优化可以减少存储引擎查询基础表的次数也可以减少MySQL服务器从存储引擎接收数据的次数。 开撸 在开始之前先先准备一张用户表(user)其中主要几个字段有id、name、age、address。建立联合索引nameage。 假设有一个需求要求匹配姓名第一个为陈的所有用户sql语句如下 SELECT * from user where name like 陈% 根据 最佳左前缀 的原则这里使用了联合索引nameage进行了查询性能要比全表扫描肯定要高。 问题来了如果有其他的条件呢假设又有一个需求要求匹配姓名第一个字为陈年龄为20岁的用户此时的sql语句如下 SELECT * from user where name like 陈% and age20 这条sql语句应该如何执行呢下面对Mysql5.6之前版本和之后版本进行分析。 Mysql5.6之前的版本 5.6之前的版本是没有索引下推这个优化的因此执行的过程如下图 会忽略age这个字段直接通过name进行查询在(name,age)这课树上查找到了两个结果id分别为2,1然后拿着取到的id值一次次的回表查询因此这个过程需要回表两次。 Mysql5.6及之后版本 5.6版本添加了索引下推这个优化执行的过程如下图 InnoDB并没有忽略age这个字段而是在索引内部就判断了age是否等于20对于不等于20的记录直接跳过因此在(name,age)这棵索引树中只匹配到了一个记录此时拿着这个id去主键索引树中回表查询全部数据这个过程只需要回表一次。 实践 当然上述的分析只是原理上的我们可以实战分析一下因此陈某装了Mysql5.6版本的Mysql解析了上述的语句如下图 根据explain解析结果可以看出Extra的值为Using index condition表示已经使用了索引下推。 总结 索引下推在非主键索引上的优化可以有效减少回表的次数大大提升了查询的效率。 关闭索引下推可以使用如下命令配置文件的修改不再讲述了毕竟这么优秀的功能干嘛关闭呢 set optimizer_switchindex_condition_pushdownoff;