首页 > 数据库 >90%的程序员都不知道Mysql索引下推

90%的程序员都不知道Mysql索引下推

时间:2023-07-17 12:55:09浏览次数:35  
标签:Mysql 下推 Server 索引 90% ICP 数据 age

索引下推(Index Condition Pushdown) ICP 是Mysql5.6之后新增的功能,主要的核心点就在于把数据筛选的过程放在了存储引擎层去处理,而不是像之前一样放到Server层去做过滤。

虽然这是一个比较简单的概念,但是可能很多不细心的同学对于索引下推会存在一个小小的误区,至于是什么,请看下文。

什么是索引下推

首先,我们创建一张user表,同时建立age_name的联合索引,同时插入3条测试数据。

然后,我们执行查询explain SELECT * from user where age >10 and name = 'a',如下图所示,就会看见Extra中显示了Using index condition,你可能就知道了,这表示出现了索引下推了。

没错,针对这个查询场景就是索引下推,那到底什么是索引下推呢?

按照我们上述的场景,实际上就存在两个索引树,一个是主键索引,存储了具体的数据的信息,另外则是age_name的联合索引,保存了主键的ID。

在没有ICP索引下推的时候,这个查询的流程应该是这样(略过无关的细节):

  1. Mysql Server层调用API查询存储引擎数据

  2. 存储引擎根据联合索引首先通过条件找到所有age>10的数据

  3. 找到的每一条数据都根据主键索引进行回表查询,直到找到不符合条件的结果

  4. 返回数据给Server层,Server根据条件对结果进行过滤,流程结束

而有了ICP之后的流程则是这样:

  1. Mysql Server层调用API查询存储引擎数据

  2. 存储引擎根据联合索引首先通过条件找到所有age>10的数据,根据联合索引中已经存在的name数据进行过滤,找到符合条件的数据

  3. 根据找到符合条件的数据,回表查询

  4. 返回数据给Server层,流程结束

对比这两个流程就会很明显的发现,使用ICP之后我们就是简单的通过联合索引中本来就有的数据直接过滤了,不需要再查到一堆无用的数据去Server层进行过滤,这样的话减少了回表的次数和返回的数据,IO次数减少了,对性能有很好的提升。

按照官方文档所说,ICP其实也存在一定的使用限制场景,只说关键的,乱七八糟的不说。

  1. 首先,ICP适用于range、ref、eq_ref和ref_or_null的场景下

  2. InnoDB和MyISAM都支持ICP,Mysql partition分表的话也可以使用

  3. 对于InndoDB而言,ICP只支持二级索引,因为主键索引它用不上不是吗?

  4. 子查询不支持

现在我们基本都使用的5.6以上的版本了,默认就是开启ICP的,想关闭的话可以通过命令SET optimizer_switch = 'index_condition_pushdown=off';

一个小小的误区

一般来说,正常情况下Mysql一次查询都只能走一个索引,我们来修改上述的表结构,把联合索引改为两个单独的索引,数据保持不变

然后我们执行查询explain SELECT * from user where age >10 and name like 'a%',结果如下图。

你会发现,我靠,怎么还有索引下推?这不科学对不对,好像无法解释嘛,难道这一次索引下推还能先查出age再下推到name索引吗,这完全不合理啊。

其实不然,真实的情况是,Using index condition并不代表一定是使用了索引下推,只是代表可以使用,但是不一定用了。。。

这个就有点坑爹,可能会对我们判断的时候造成误解啊。

如果你去网上搜很多人举例子这样建索引,然后告诉你这就是索引下推的时候,你可以尽情的喷他了,我们说索引下推一定是在联合索引的情况下,根据联合索引本身就有的数据直接做一次过滤,而不用再进行多次无用的回表再到Server层进行过滤,这一点你要很明确才行。

本文由mdnice多平台发布

标签:Mysql,下推,Server,索引,90%,ICP,数据,age
From: https://www.cnblogs.com/wind-xwj/p/17559792.html

相关文章

  • mysql截取字符串函数 --九五小庞
    一、mysql截取字符串函数1、left(str,length)从左边截取length2、right(str,length)从右边截取length3、substring(str,index)当index>0从左边开始截取直到结束 当index<0从右边开始截取直到结束 当index=0返回空4、substring(str,index,len)截取str,从index开始,截取len......
  • ubuntu20.04使用plx9054官方驱动 转载
    转载地址http://wuhongyi.cn/PKUXIADAQ/en/INSTALL.htmlInstallationofSoftwareInstallationforthissoftwareisrequriredbyCERNROOT6GCC>=4.8FFTW3OPENSSLTheoperatingsystemtestedbythisprogramincludesCentOS7/ScientificLinux7/......
  • mysql 查询存储过程调用日志
    如何实现MySQL查询存储过程调用日志作为一名经验丰富的开发者,我将在下面的文章中向你介绍如何实现MySQL查询存储过程调用日志。首先,让我们来了解一下整个流程,然后逐步介绍每一步需要做的事情和相应的代码。流程概述下面是实现MySQL查询存储过程调用日志的整体流程:步骤......
  • mysql 查询blob字段
    如何实现“mysql查询blob字段”概述在MySQL数据库中,BLOB字段是用于存储二进制数据的数据类型,包括图片、音频、视频等。本文将教会你如何通过MySQL查询BLOB字段的值。流程下面是实现“mysql查询blob字段”的流程:步骤描述1连接到MySQL数据库2创建一个查询语句3......
  • mysql 查询 表空间
    MySQL查询表空间MySQL是一个开源的关系型数据库管理系统,被广泛应用于各种规模的应用程序中。在MySQL中,表空间是用于存储数据的物理空间。理解和管理表空间对于提高数据库性能和管理数据库非常重要。本文将介绍如何使用MySQL查询表空间信息,并提供一些示例代码来帮助读者更好地理解......
  • mysql 查看字符型数据是否有空格
    MySQL查看字符型数据是否有空格在使用MySQL数据库时,有时候我们需要查看字符型数据是否包含空格。空格是一种常见的特殊字符,它在字符串中可能带来一些问题,例如在比较字符串时可能会导致错误的结果。本文将介绍如何使用MySQL来查看字符型数据是否包含空格,并提供相应的代码示例......
  • MySQL-安装
    MySQL8.0版本-安装篇目录MySQL8.0版本-安装篇0.参考资料1.MySQL免安装版下载(8.0.22)2.MySQL的安装2.1解压下载好的压缩包【路径不为中文】2.2创建my.ini配置文件,并生成初始密码2.3安装+启动MySQL服务2.4进入MySQL2.5配置环境变量3.Navacat的安装0.参考资料......
  • MySQL-入门笔记【5.6版本】
    MySQL-入门笔记【5.6版本】目录MySQL-入门笔记【5.6版本】1.概述1.1MySQL的安装+配置1.2命令行-连接MySQL1.3Navicat连接MySQL1.4执行SQL1.5导出数据表的SQL1.6、常用的管理语句2.select查询-DQL2.1as别名:2.2distinct关键字:2.3where关键字2.4between关键字......
  • P4590 [TJOI2018] 游园会
    P4590[TJOI2018]游园会题意小豆参加了NOI的游园会,会场上每完成一个项目就会获得一个奖章,奖章只会是\(N,O,I\)的字样。在会场。上他收集到了\(K\)个奖章组成的串。兑奖规则是奖章串和兑奖串的最长公共子序列长度为小豆最后奖励的等级。现在已知兑奖串长度为\(N\),并且在兑奖串......
  • MySQL 索引、事务与存储引擎
    目录一、索引1.概念2.作用3.副作用4.创建索引的原则依据5.优化6.分类二、事务1.事务的概念2.事务的特点(1)原子性(2)一致性(3)隔离性(4)持久性3.扩展事务之间的相互影响分为几种4.Mysql及事物隔离级别5.事务控制语句6.使用set设置控制事务三、存储引擎一、索引1.概念是......