Mysql性能优化:什么是索引下推?
什么是索引下推?
索引下推(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性能优化:什么是索引下推?相关推荐
- MySQL性能优化之:索引下推
转自:https://www.cnblogs.com/Chenjiabing/p/12600926.html 导读 索引下推(index condition pushdown )简称ICP,在Mysq ...
- MySQL性能优化:SQL慢查询优化,索引优化,表优化
1. MySQL优化概述 MySQL 优化是一个综合性的技术,在优化上存在着一个调优金字塔的说法,如下: 很明显从图上可以看出,越往上走,难度越来越高,收益却是越来越小的.比如硬件和 OS 调优,需要 ...
- mysql同时满足升序和降序_MySQL性能优化(三):索引
点击上方蓝色"码农架构",选择"设为星标" 专注于高可用.高性能.高并发类技术分享! 索引原理 如果一本新华字典假如没有目录,想要查找某个字,就不得不从第一页开 ...
- [官方] mysql 性能优化文档(中英文自译)
大家好,我是烤鸭: 根据官方文档翻译并精简部分内容.建议有时间的朋友下载原版查看,全文106页pdf,快的话1-2天就能看完.自己翻译的有些地方可能不完整,欢迎指正. 官方pdf下载,需登录: htt ...
- MySQL 性能优化:8 种常见 SQL 错误用法!
声明:转载自 MySQL 性能优化:8 种常见 SQL 错误用法! 1.LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方.比如对于下面简单的语句,一般 DBA 想到的办法是 ...
- 《MySQL性能优化和高可用架构实践》阅读总结
文章目录 介绍 第1章 MySQL架构介绍 1.1 MySQL简介 1.2 MySQL主流的分支版本 1.3 MySQL存储引擎 1.4 MySQL逻辑架构 1.5 MySQL物理文件体系结构 第2章 ...
- Mysql性能优化方案
2019独角兽企业重金招聘Python工程师标准>>> 内容简介:这是一篇关于mysql 性能优化的文章.网上有不少mysql 性能优化方案,不过,mysql的优化同sql serv ...
- mysql半连接_mysql表的半连接,反连接导致的mysql性能优化剖析
[导读] 关于Oracle的半连接,反连接,我一直认为这是一个能讲很长时间的话题,所以在我的新书<Oracle DBA工作笔记>中讲性能优化的时候,我花... 关于Oracle的半连接,反 ...
- 记一次mysql性能优化过程
2019独角兽企业重金招聘Python工程师标准>>> 转发自:记一次mysql性能优化过程 由于配置是运行过那么长时间,很稳定,基本上不考虑,所以本次主要是sql的优化,并且集中在 ...
- MySQL 性能优化,优化设计及设计原则解读
MySQL性能优化的目的 如何合理的设计数据库? 什么样的数据库设计才能给后期DBA优化提供基石? 数据库设计与程序设计的差异? 数据库设计早期优化 1. 关系明确(理清表之间的关系,可以通过冗余的方 ...
最新文章
- 把内表 itab1 的 n1 到 n2 行内容附加到 itab2 内表中去.
- 电脑硬盘为什么叫计算机,电脑分区为何从C盘开始?
- android7.1以太网动态ip,android7.1编译路上的那些坑!(部分转自网络整理)
- 接受你无法改变的事情 改变你可以改变的事情
- $(document).click() 在苹果手机上不能正常运行
- 镜头像差之二——色差
- ubuntu 显卡驱动卸载和安装
- 从0到1开发H5游戏
- H5网页微信授权登录
- 18款表白源码,搭建网站必备,总有一款适合你
- 选择任意你熟悉的编程语言开发一个C/S、B/S、B/A/S或基于移动设备的民航售票系统,实现基本功能
- user相关的一些命令及用法
- 什么是口碑营销?如何做到产品口口相传
- FME中的栅格数据操作之一——转换器小结
- 根据经纬度获取具体位置(百度,Java实现)
- 学C语言,C++是自学好还是去培训机构?
- MicroPython-On-ESP8266——数码管的使用,从一个8段管开始
- java多态(java多态的概念)
- c语言awx文件读取,气象卫星分发产品及其格式规范AWX2.1(数据格式C语言).doc
- 药品食品管理功能性食品体系 国稻种芯:药食同源大健康产业
热门文章
- 7款最好用的图片无损,视频无损压缩软件
- 计算机搜索功能怎么搜内容,怎么让Windows7系统搜索文件内容
- php未来发展前景如何
- 运放输入偏置电流方向_运算放大器+仪表放大器:如何为偏置电流提供直流回路?...
- 测试——web案例思维导图
- java拼音查询_Java汉字获取拼音、笔划、偏旁部首
- java 汉字转拼音缩写_用JAVA实现汉字转拼音缩写
- ps 批处理图片大小和压缩
- html div 字体向左自动,在css中怎样设置字体靠左?
- html怎么设置整体右对齐,如何在html中右对齐按钮