什么是索引下推?

索引下推(index condition pushdown )简称ICP,在Mysql5.6的版本上推出,用于优化查询。

在不使用ICP的情况下,在使用非主键索引(又叫普通索引或者二级索引)进行查询时,存储引擎通过索引检索到数据,然后返回给MySQL服务器,服务器然后判断数据是否符合条件 。

在使用ICP的情况下,如果存在某些被索引的列的判断条件时,MySQL服务器将这一部分判断条件传递给存储引擎,然后由存储引擎通过判断索引是否符合MySQL服务器传递的条件,只有当索引符合条件时才会将数据检索出来返回给MySQL服务器 。

索引条件下推优化可以减少存储引擎查询基础表的次数,也可以减少MySQL服务器从存储引擎接收数据的次数。

开撸

在开始之前先先准备一张用户表(user),其中主要几个字段有:id、name、age、address。建立联合索引(name,age)。

假设有一个需求,要求匹配姓名第一个为陈的所有用户,sql语句如下:

SELECT * from user where  name like '陈%'

根据 "最佳左前缀" 的原则,这里使用了联合索引(name,age)进行了查询,性能要比全表扫描肯定要高。

问题来了,如果有其他的条件呢?假设又有一个需求,要求匹配姓名第一个字为陈,年龄为20岁的用户,此时的sql语句如下:

SELECT * from user where  name like '陈%' and age=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. 实践

当然上述的分析只是原理上的,我们可以实战分析一下,因此陈某装了Mysql5.6版本的Mysql,解析了上述的语句,如下图:

根据explain解析结果可以看出Extra的值为Using index condition,表示已经使用了索引下推。

总结

索引下推在非主键索引上的优化,可以有效减少回表的次数,大大提升了查询的效率。

关闭索引下推可以使用如下命令,配置文件的修改不再讲述了,毕竟这么优秀的功能干嘛关闭呢:

set optimizer_switch='index_condition_pushdown=off';

小道消息

最近发布的文章收到了很多读者的反馈,为了方便大家一起学习交流,陈某创建了一个技术交流群,有兴趣的可以加入一下

往期推荐

Mysql性能优化:为什么要用覆盖索引?

一条SQL查询语句是如何执行的?

SpringCloud 2020新版视频发布

幂等性如何实现?带你了解一波!!!

靓仔,整合SpringBoot还在搜配置吗?老司机教你一招!!!

老司机带你聊聊接口限流!!!

Spring解决循环依赖,你真的懂了吗?

老司机带你从源码开始撸Spring生命周期!!!

Mysql性能优化:什么是索引下推?相关推荐

  1. MySQL性能优化之:索引下推

    转自:https://www.cnblogs.com/Chenjiabing/p/12600926.html 导读 索引下推(index condition pushdown )简称ICP,在Mysq ...

  2. MySQL性能优化:SQL慢查询优化,索引优化,表优化

    1. MySQL优化概述 MySQL 优化是一个综合性的技术,在优化上存在着一个调优金字塔的说法,如下: 很明显从图上可以看出,越往上走,难度越来越高,收益却是越来越小的.比如硬件和 OS 调优,需要 ...

  3. mysql同时满足升序和降序_MySQL性能优化(三):索引

    点击上方蓝色"码农架构",选择"设为星标" 专注于高可用.高性能.高并发类技术分享! 索引原理 如果一本新华字典假如没有目录,想要查找某个字,就不得不从第一页开 ...

  4. [官方] mysql 性能优化文档(中英文自译)

    大家好,我是烤鸭: 根据官方文档翻译并精简部分内容.建议有时间的朋友下载原版查看,全文106页pdf,快的话1-2天就能看完.自己翻译的有些地方可能不完整,欢迎指正. 官方pdf下载,需登录: htt ...

  5. MySQL 性能优化:8 种常见 SQL 错误用法!

    声明:转载自 MySQL 性能优化:8 种常见 SQL 错误用法! 1.LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方.比如对于下面简单的语句,一般 DBA 想到的办法是 ...

  6. 《MySQL性能优化和高可用架构实践》阅读总结

    文章目录 介绍 第1章 MySQL架构介绍 1.1 MySQL简介 1.2 MySQL主流的分支版本 1.3 MySQL存储引擎 1.4 MySQL逻辑架构 1.5 MySQL物理文件体系结构 第2章 ...

  7. Mysql性能优化方案

    2019独角兽企业重金招聘Python工程师标准>>> 内容简介:这是一篇关于mysql 性能优化的文章.网上有不少mysql 性能优化方案,不过,mysql的优化同sql serv ...

  8. mysql半连接_mysql表的半连接,反连接导致的mysql性能优化剖析

    [导读] 关于Oracle的半连接,反连接,我一直认为这是一个能讲很长时间的话题,所以在我的新书<Oracle DBA工作笔记>中讲性能优化的时候,我花... 关于Oracle的半连接,反 ...

  9. 记一次mysql性能优化过程

    2019独角兽企业重金招聘Python工程师标准>>> 转发自:记一次mysql性能优化过程 由于配置是运行过那么长时间,很稳定,基本上不考虑,所以本次主要是sql的优化,并且集中在 ...

  10. MySQL 性能优化,优化设计及设计原则解读

    MySQL性能优化的目的 如何合理的设计数据库? 什么样的数据库设计才能给后期DBA优化提供基石? 数据库设计与程序设计的差异? 数据库设计早期优化 1. 关系明确(理清表之间的关系,可以通过冗余的方 ...

最新文章

  1. 把内表 itab1 的 n1 到 n2 行内容附加到 itab2 内表中去.
  2. 电脑硬盘为什么叫计算机,电脑分区为何从C盘开始?
  3. android7.1以太网动态ip,android7.1编译路上的那些坑!(部分转自网络整理)
  4. 接受你无法改变的事情 改变你可以改变的事情
  5. $(document).click() 在苹果手机上不能正常运行
  6. 镜头像差之二——色差
  7. ubuntu 显卡驱动卸载和安装
  8. 从0到1开发H5游戏
  9. H5网页微信授权登录
  10. 18款表白源码,搭建网站必备,总有一款适合你
  11. 选择任意你熟悉的编程语言开发一个C/S、B/S、B/A/S或基于移动设备的民航售票系统,实现基本功能
  12. user相关的一些命令及用法
  13. 什么是口碑营销?如何做到产品口口相传
  14. FME中的栅格数据操作之一——转换器小结
  15. 根据经纬度获取具体位置(百度,Java实现)
  16. 学C语言,C++是自学好还是去培训机构?
  17. MicroPython-On-ESP8266——数码管的使用,从一个8段管开始
  18. java多态(java多态的概念)
  19. c语言awx文件读取,气象卫星分发产品及其格式规范AWX2.1(数据格式C语言).doc
  20. 药品食品管理功能性食品体系 国稻种芯:药食同源大健康产业

热门文章

  1. 7款最好用的图片无损,视频无损压缩软件
  2. 计算机搜索功能怎么搜内容,怎么让Windows7系统搜索文件内容
  3. php未来发展前景如何
  4. 运放输入偏置电流方向_运算放大器+仪表放大器:如何为偏置电流提供直流回路?...
  5. 测试——web案例思维导图
  6. java拼音查询_Java汉字获取拼音、笔划、偏旁部首
  7. java 汉字转拼音缩写_用JAVA实现汉字转拼音缩写
  8. ps 批处理图片大小和压缩
  9. html div 字体向左自动,在css中怎样设置字体靠左?
  10. html怎么设置整体右对齐,如何在html中右对齐按钮