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

news2025/2/2 1:52:01

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

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

什么是索引下推

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

alt

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

alt

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

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

alt

在没有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一次查询都只能走一个索引,我们来修改上述的表结构,把联合索引改为两个单独的索引,数据保持不变

alt

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

alt

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

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

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

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

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/762669.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无需点跟踪,克服DragGAN缺陷!中科大联合上海AI Lab发布FreeDrag:可稳定拖动语义内容

FreeDrag无需点跟踪,即可实现更高质量的拖动编辑效果! 近日,在AIGC的广阔世界里出现了一个火热的图像编辑方法—即通过在给定图像上通过把语义内容从原位置(handle point)拖动到目标位置(target point&…

12宫格 抽奖逻辑实现【直接可用】

先看视频&#xff0c;比较卡&#xff0c;毕竟是视频转gif导出的 /*** Author : 马占柱* E-mail : mazhanzhu_3351163.com* Time : 2023/5/24 17:46* Desc : 12宫格 盲盒抽奖*/ public class NineLuckPan extends View {private Paint mPaint;private ArrayList<RectF>…

linux下安装jdk

1、创建目录 cd /opt mkdir /opt/jdk 2、将jdk放入/opt/jdk中 3、 解压目录 cd /opt/jdk tar -zxvf jdk-8u261-linux-x64.tar.gz 4、拷贝目录 mkdir /usr/local/java mv /opt/jdk/jdk1.8.0_261 /usr/local/java 5、配置环境变量的配置文件 vim /etc/profile 在配置文件中添加…

PyCharm 常用快捷键

目录 1、代码编辑快捷键 2、搜索/替换快捷键 3、代码运行快捷键 4、代码调试快捷键 5、应用搜索快捷键 6、代码重构快捷键 7、动态模块快捷键 8、导航快捷键 9、通用快捷键 1、代码编辑快捷键 序号快捷键作用1CTRLALTSPACE快速导入任意类2CTRLSHIFTENTER代码补全3SHI…

基于STM32LVGL8.2保姆级教程③代码框架移植

这里推荐去看正点原子的视频 对照教程一步步的移植即可 需要一点时间 点击传送门直达 如果你觉得太繁琐 也可以找我直接获取移植好的框架(免费分享) 移植完毕的工程截图~ 注意事项 这两个文件的内容默认是使用宏定义关闭的 需要你手动开启(我的代码已经完成了这一步)

自动上香木鱼念珠颂钵功德流量主小程序开发

自动上香木鱼念珠颂钵功德流量主小程序开发 自动上香木鱼念珠颂钵功德流量主小程序的功能包括&#xff1a; 自动上香&#xff1a;用户可以设置定时任务&#xff0c;小程序会在指定时间自动上香&#xff0c;无需用户手动操作。木鱼念珠&#xff1a;小程序提供虚拟的木鱼念珠&a…

高压放大器需要注意哪些指标

高压放大器是一种专门用于输出高电压信号的电子设备&#xff0c;主要应用于精密测量、医疗设备、电力电子等领域中。在选择高压放大器时&#xff0c;需要注意其性能指标&#xff0c;以确保设备的稳定性和可靠性。 以下是高压放大器需要注意的性能指标&#xff1a; 输出电压范围…

一个简单的python案例,用正则采集小说网站

目录标题 前言尾语 前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 使用Python抓取xx阁小说需要用到 requests 库和正则表达式模块 re&#xff0c;下面是一个具体的实现步骤&#xff1a; 1. 首先需要使用 requests 库请求小说的页面 例如&#xff1a; import requestsu…

运维数据(1):谈谈运维数据的8大特征

在这个数据作为市场要素之一的时代&#xff0c;数据已从理念上的资产认同逐步走向实践上的深入行动。单从经济利益上去评定数据的资产化价值&#xff0c;我认为太狭隘&#xff0c;把数据仅仅作为有形物品去交易&#xff0c;价值的发挥未免太过局限。我家那一亩三分地种的红薯&a…

等保——windows终端和服务器测评

一、本文适用于Windows系统&#xff0c;但有些版本不适用&#xff0c;例如win10、win11等&#xff0c;因为没有密码策略模块 二、针对于win7的测评过程 1、winR打开命令行&#xff0c;输入gpedit.msc&#xff0c;打开本地组策略编辑器&#xff08;win10以上版本没有这个模块&…

辅助笔记-linux找回root密码(CentOS7.6)

linux找回root密码(CentOS7.6) 文章目录 linux找回root密码(CentOS7.6)步骤1步骤2步骤3步骤4步骤5 本文主要参考自“韩顺平教育–linux找回root密码.docx”。 步骤1 首先&#xff0c;启动系统进入开机界面&#xff0c;注意在此界面下的5秒之内&#xff0c;使用键盘的上下键使得…

基于SSM+Vue的少儿编程网上报名系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

vue复习

1.mustache动态插值 <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, initial-scale…

刚入暑假,开学季产品销量已抬头

随着入伏&#xff0c;气温进入一年当中最热的阶段&#xff0c;倏忽间&#xff0c;孩子们进入酣畅淋漓的暑假模式已经两周多了&#xff0c;游戏、雪糕和旅行可能都已经尝试过了&#xff0c;或是正在进行&#xff0c;然而&#xff0c;这些都不影响开学季产品如期增长的势头。加上…

智能ai绘画软件帮你用科技点亮创意火花

李明&#xff1a;嘿&#xff0c;你听说过ai绘画软件吗&#xff1f;我最近对数字艺术产生了浓厚的兴趣 王磊&#xff1a;当然&#xff01;ai绘画软件真是太神奇了&#xff01;它可以将抽象的文字描述转换成惊人的艺术作品。 李明&#xff1a;是吗&#xff1f;它们绘制的效果怎…

排序算法的补充

建议先去看看我之前写的基础排序算法 补充一&#xff1a;快排中partition函数的三种实现形式 1.hoare法---与第2种方法类似 int Partition1(int*a,int left,int right) {int keyi left;while (left < right) {while (left < right && a[right] > a[keyi])…

pytest+yaml接口自动化测试框架封装

1. 框架封装基础 以下是框架封装的技术基础&#xff0c;打好这些基础的话&#xff0c;能够很轻松地封装出来框架 对于基础还有欠缺的话&#xff0c;建议针对性精进&#xff1a; 1. 扎实的Python语言基础 函数、类文件读写处理报错数据结构标准库测试框架库&#xff08;unit…

goland设置内置命令行为当前项目环境

goland设置内置的命令行为当前项目环境 修改 GoLand 中的 SSH 终端配置即可

125、仿真-基于51单片机的自行车电动车或者电机数码管控制系统设计(Proteus仿真+程序+原理图+配套资料等)

方案选择 单片机的选择 方案一&#xff1a;STM32系列单片机控制&#xff0c;该型号单片机为LQFP44封装&#xff0c;内部资源足够用于本次设计。STM32F103系列芯片最高工作频率可达72MHZ&#xff0c;在存储器的01等等待周期仿真时可达到1.25Mip/MHZ(Dhrystone2.1)。内部128k字节…

linux守护进程介绍 | Linux的热拔插UDEV机制

简介 udev是一个设备管理工具&#xff0c;udev以守护进程的形式运行&#xff0c;通过侦听内核发出来的uevent来管 理/dev目录下的设备文件。udev在用户空间运行&#xff0c;而不在内核空间 运行。它能够根据系统中的硬 件设备的状态动态更新设备文件&#xff0c;包括设备文件的…