MySQL性能优化之:索引下推
转自:https://www.cnblogs.com/Chenjiabing/p/12600926.html
导读
索引下推(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之前版本和之后版本进行分析。
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_switch='index_condition_pushdown=off';
MySQL性能优化之:索引下推相关推荐
- MySQL查询性能优化七种武器之索引下推
前面已经讲了MySQL的其他查询性能优化方式,没看过可以去了解一下: MySQL查询性能优化七种武器之索引潜水 MySQL查询性能优化七种武器之链路追踪 今天要讲的是MySQL的另一种查询性能优化方式 ...
- MySQL性能优化,索引优化
优化需求: 稳定性和业务可持续性,比性能更加重要!!! sql性能优化: SQL及索引 > 数据库表结构 > 系统配置 > 硬件 数据库表结构:分库分表,读写分离,存储引擎,表设计 ...
- MySQL 性能优化,索引和查询优化
https://my.oschina.net/qrmc/blog/1822373 要知道为什么使用索引,要知道如何去使用好索引,使自己的查询达到最优性能,需要先了解索引的数据结构和磁盘的存取原理 1. ...
- 查询索引MySQL性能优化 查询索引
时光紧张,先记一笔,后续优化与完善. MySQL能性优化 能性优化是通过某些有效的方法来高提MySQL的行运速度,增加占用的磁盘空间.能性优化含包很多方面,例如优化查询速度,优化新更速度和优化MySQ ...
- MySQL性能优化:SQL慢查询优化,索引优化,表优化
1. MySQL优化概述 MySQL 优化是一个综合性的技术,在优化上存在着一个调优金字塔的说法,如下: 很明显从图上可以看出,越往上走,难度越来越高,收益却是越来越小的.比如硬件和 OS 调优,需要 ...
- [官方] 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的半连接,反 ...
最新文章
- 机器学习PAI产品架构
- android fastjson java.lang.ClassCastException
- 机器学习 —— 概率图模型(推理:连续时间模型)
- maven存在的意义及其与eclipse的简单配置
- 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-01-CNN基础知识点
- 神经机器阅读理解最新综述:方法和趋势
- Jetbrains全系列完美破解--------亲测可用
- mshflexgrid固定行对齐_放开那个空格键让我来,word对齐文字的四个方法
- python导入同一文件夹下的类_python自定义模块
- PowerShell 远程执行任务
- 局域网 ARP 欺骗原理详解
- Windows系统安装jdk1.6
- delphi 远程mysql_Delphi远程连接Mysql的实现方法
- Android 之文件夹排序
- 9 行 javascript 代码获取 QQ 群成员
- Flappy Bird游戏 C语言实现
- html伸缩布局,HTML-CSS:伸缩布局
- 爬取B站20万+条弹幕,我学会了如何成为B站老司机
- 29-SpringBoot 安全与SpringSecurity
- 二进制的应用——枚举子集
热门文章
- 全Flash网站和单个Flash作品制作的区别
- ProtoBuf协议详解
- python如何循环执行_如何在python中多次运行for循环?
- python 获取浏览器句柄下的网页控件,Python获取浏览器窗口句柄过程解析
- Spring重点面题总结
- Android字节码替换方法,滴滴开源 DroidAssist : 轻量级 Android 字节码编辑插件
- [译] 使用 python 分析 14 亿条数据
- 高可用之KeepAlived(2):keepalived+lvs
- LVM源码分析2-libdaemon
- 《OpenACC并行程序设计:性能优化实践指南》一 3.1 性能分析技术和术语