转自: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性能优化之:索引下推相关推荐

  1. MySQL查询性能优化七种武器之索引下推

    前面已经讲了MySQL的其他查询性能优化方式,没看过可以去了解一下: MySQL查询性能优化七种武器之索引潜水 MySQL查询性能优化七种武器之链路追踪 今天要讲的是MySQL的另一种查询性能优化方式 ...

  2. MySQL性能优化,索引优化

    优化需求: 稳定性和业务可持续性,比性能更加重要!!! sql性能优化: SQL及索引 > 数据库表结构 > 系统配置 > 硬件 数据库表结构:分库分表,读写分离,存储引擎,表设计 ...

  3. MySQL 性能优化,索引和查询优化

    https://my.oschina.net/qrmc/blog/1822373 要知道为什么使用索引,要知道如何去使用好索引,使自己的查询达到最优性能,需要先了解索引的数据结构和磁盘的存取原理 1. ...

  4. 查询索引MySQL性能优化 查询索引

    时光紧张,先记一笔,后续优化与完善. MySQL能性优化 能性优化是通过某些有效的方法来高提MySQL的行运速度,增加占用的磁盘空间.能性优化含包很多方面,例如优化查询速度,优化新更速度和优化MySQ ...

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

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

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

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

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

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

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

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

  9. Mysql性能优化方案

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

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

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

最新文章

  1. 机器学习PAI产品架构
  2. android fastjson java.lang.ClassCastException
  3. 机器学习 —— 概率图模型(推理:连续时间模型)
  4. maven存在的意义及其与eclipse的简单配置
  5. 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-01-CNN基础知识点
  6. 神经机器阅读理解最新综述:方法和趋势
  7. Jetbrains全系列完美破解--------亲测可用
  8. mshflexgrid固定行对齐_放开那个空格键让我来,word对齐文字的四个方法
  9. python导入同一文件夹下的类_python自定义模块
  10. PowerShell 远程执行任务
  11. 局域网 ARP 欺骗原理详解
  12. Windows系统安装jdk1.6
  13. delphi 远程mysql_Delphi远程连接Mysql的实现方法
  14. Android 之文件夹排序
  15. 9 行 javascript 代码获取 QQ 群成员
  16. Flappy Bird游戏 C语言实现
  17. html伸缩布局,HTML-CSS:伸缩布局
  18. 爬取B站20万+条弹幕,我学会了如何成为B站老司机
  19. 29-SpringBoot 安全与SpringSecurity
  20. 二进制的应用——枚举子集

热门文章

  1. 全Flash网站和单个Flash作品制作的区别
  2. ProtoBuf协议详解
  3. python如何循环执行_如何在python中多次运行for循环?
  4. python 获取浏览器句柄下的网页控件,Python获取浏览器窗口句柄过程解析
  5. Spring重点面题总结
  6. Android字节码替换方法,滴滴开源 DroidAssist : 轻量级 Android 字节码编辑插件
  7. [译] 使用 python 分析 14 亿条数据
  8. 高可用之KeepAlived(2):keepalived+lvs
  9. LVM源码分析2-libdaemon
  10. 《OpenACC并行程序设计:性能优化实践指南》一 3.1 性能分析技术和术语