MySQL的索引下推

优化规则与表达式下推的黑名单 本文主要介绍优化规则的黑名单与表达式下推的黑名单。 阅读详情

前言

说到MySQL的优化手段,不得不提的是MYSQL5.6中引入的一种特性,索引下推,英文是 index condition pushdown,一般简称为 ICP。这也是MySQL面试中经常被问到的一个考点,本文就此分享下索引下推是怎么一回事,它是如何对提高查询效率起到帮助的。

理解索引下推

索引下推就是指在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数来提高查询效率。

如何理解呢? 我们直接上栗子来解释:

  1. 新建用户表

CREATE TABLE user( `id` int NOT NULL AUTO_INCREMENT, `zipcode` varchar(20) DEFAULT NULL, `name` varchar(20) DEFAULT NULL, `address` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`), index idx_zip_name(`zipcode`, `name`) ) ENGINE=INNODB; insert into user(zipcode, name, address) values ('100001', '陈旭阳', '杭州'), ('100001', '胡歌', '上海'), ('200002', '杨幂', '北京'), ('300002', '刘诗诗', '南京'); 复制代码
  • 创建了基于邮编zipcode和名称name的联合索引idx_zip_name,用于查找某个邮编下,名字包含陈的人。

  1. 查询语句

select * from user where zipcode = '100001' and name like '%陈%' and address like '%余杭%'; 复制代码
  • 查询条件根据zipcode精确查找,name和address全模糊匹配。

如果MySQL5.6以前, 没有索引下推特性,整个流程如下图:

编辑切换为居中

  • 联合索引中知道100001的数据项,因为name是全模糊,无法走索引,address压根没有索引,他们无法在联合索引中过滤,怎么办?只能回到数据最全的聚簇索引上进行name like '%陈%' and address like '%余杭%'这个逻辑的过滤。

  • 按照上面的方式,每次回到聚簇索引这个一个称做 “回表” 的过程,势必增加磁盘IO,从而影响查询性能。

那么有什么办法可以优化呢?

优化的目标就是尽量减少回表这一过程,我们发现联合索引上竟然有了name字段的信息,为什么我们不能充分利用呢? name like '%陈%'我们可以直接在索引树上进行判断name是不是包含陈,从而减少回表次数。这也正是MySQL5.6中优化的特性,如下图所示:

编辑切换为居中

  • 根据查询条件name like '%陈%',陈旭阳包含了陈, 就无需回表了。

上面途中的索引都用表格表示,只是为了方便,实际上索引底层数据结构是B+数据,如果不了解的,可以阅读文章:一步步带你设计MySQL索引数据结构

一句话总结:索引下推(index condition pushdown,ICP),有效的减少了回表次数,提高了查询效率。

索引下推性能比较

竟然索引下推可以提高效率,那我们验证下。

  1. 沿用上面的user表

  2. 创建存储过程,添加数据

DELIMITER // CREATE PROCEDURE insert_user(max_num INT) BEGIN DECLARE i INT DEFAULT 0; SET autocommit = 0; REPEAT SET i = i + 1; INSERT INTO user(zipcode,name,address) VALUES ('10018', '陈旭阳', '杭州'); UNTIL i =max_num END REPEAT; COMMIT; END // DELIMITER ; 复制代码
  1. 调用存储过程

call insert_user(1000000); 复制代码
  1. 打开性能检查工具profiling

set profiling = 1; 复制代码
  1. 启用索引下推方式查询

select * from user where zipcode = '10018' and name like '%李%'; 复制代码
  1. 禁用索引下推方式查询

select /*+ no_icp(user) */ * from user where zipcode = '10018' and name like '%李%'; 复制代码
  1. 查看当前会话下的profiles

show profiles; 复制代码
  1. 结果如下:

  • 有索引下推0.21s

  • 没有索引下推花了2.6s

​使用ICP性能提高还是比较明显的,特别是数据量大的情况下。

执行计划中的索引下推

如何判断你的SQL中是否使用了到索引下推的特性呢?

我们利用explain查看SQL的执行计划时,如果发现Extra字段中有Using index condition,即表示使用到了索引下推。

注意如果发现一直没有用上索引下推,需要检查下功能是否被禁用,默认是打开的。

  • 可以通过设置系统变量optimizer_switch控制:index_condition_pushdown

# 打开索引下推 SET optimizer_switch = 'index_condition_pushdown=on'; # 关闭索引下推 SET optimizer_switch = 'index_condition_pushdown=off'; 复制代码

总结

本文介绍了索引下推特性,并简要分析了它的实现原理。虽然说,这个特性MySQL支持了,但是为什么我们还要学习理解它呢,因为它对于我们如何写SQL、如何创建索引还是起着指导作用的。如果本文对你有帮助的话,请留下一个赞吧。

Mysql【索引覆盖、索引下推、索引合并、索引跳跃】介绍 上图来自MySQL官方文档。MySQL服务层:包括NoSQL和SQL接口、查询解析器、优化器、缓存和Buffer等组件。存储引擎层:各种插件式的表格存储引擎,实现事务、索引等各种存储引擎相关的特性。文件系统层: 读写物理文件。MySQL服务层负责SQL语法解析、触发器、视图、内置函数、binlog、生成执行计划等,并调用存储引擎层去执行数据的存储和检索。我们后续说到的“索引下推”,它的“下”其实就是指将部分上层(服务层)负责的事情,交给了下层(存储引擎)去处理。 阅读详情

相关推荐

你不得不知的MYSQL优化——索引下推

说到MySQL的优化手段,不得不提的是MYSQL5.6中引入的一种新特性,索引下推,英文是,一般简称为ICP。这也是MySQL面试中经常被问到的一个考点,本文就此分享下索引下推是怎么一回事,它是如何对提高查询效率起到帮助的。本文介绍了索引下推特性,并简要分析了它的实现原理。虽然说,这个特性MySQL支持了,但是为什么我们还要学习理解它呢,因为它对于我们如何写SQL、如何创建索引还是起着指导作用的。如果本文对你有帮助的话,请留下一个赞吧。

Huangjiazhen711的博客 868

Realtek RTD1319D芯片解析:H.266与AV1双解码的机顶盒SoC

视频编解码技术是数字媒体传输的核心,H.266/VVC作为新一代标准,相比H.265提升50%压缩效率,显著降低带宽需求。其实现原理依赖于专用硬件解码器和并行处理架构,在超高清视频传输领域具有重要价值。Realtek RTD1319D作为首款商用H.266处理器,采用异构计算设计,集成四核ARM CPU和独立视频处理单元,同时支持AV1解码,兼顾市场兼容性。该SoC特别适合4K机顶盒、数字标牌等应用场景,其HDMI 2.1a接口和DVB解调器为超高清内容传输提供完整解决方案。开发时需注意散热设计和内存配置优

weixin_42591413的博客 671

mysql索引下推

索引下推

qq_32979219的博客 8059

基于 PID 算法的 STM32 步进电机高精度位置控制系统设计与实现(工业自动化应用)

硬件层面:选用 STM32F103C8T6+A4988 + 欧姆龙编码器的组合,兼顾工业可靠性与成本,接线需注意强弱电分离和信号抗干扰;软件层面:核心为位置式 PID 闭环控制,Mermaid 流程图清晰展现 “采集 - 运算 - 驱动” 的闭环逻辑,代码模块化易移植;性能层面:无负载定位误差≤±1 脉冲,带载误差≤±3 脉冲,满足工业自动化高精度位置控制需求。

weixin_42300449的博客 194

无法加载文件:C:\Users\Lenovo\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本编程

当您遇到类似于"无法加载文件:C:\Users\Lenovo\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本编程"的错误消息时,请按照上述步骤来解决问题。当您尝试加载文件C:\Users\Lenovo\AppData\Roaming\npm\cnpm.ps1时,可能会遇到类似于"无法加载文件:C:\Users\Lenovo\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本编程"的错误消息。请注意,更改执行策略可能会带来一些安全风险。

PixelInk的博客 1922

MySQL- 索引下推

索引下推(ICP)是 MySQL 5.6 引入的一个重要优化技术,它通过将部分查询条件“下推”到索引扫描阶段来减少回表操作,从而提高查询性能。索引下推特别适合使用复合索引的场景,通过有效地减少不必要的 I/O 操作,能够显著提升查询的执行效率。在实际应用中,可以通过EXPLAIN语句来查看索引下推是否生效,并结合查询模式和索引设计来充分利用这一优化技术。

青衫客36的博客 3238

图像处理之边缘检测[微分算子、Canny算子和LOG算子]

LOG算子是在经典算子的基础上发展起来的边缘检测算子,根据信噪比求得检测边缘的最优滤波器。边缘总是以强度突变的形式出现,可以定义为图像局部特性的不连续性,如灰度的突变和纹理结构的突变等。图像的边缘包含了物体形状的重要信息,它不仅在分析图像时大幅度地减少了要处理的信息量,而且还保护了目标的边界结构。对于复杂的图像,采用Roberts算子不能较好地得到图像的边缘,而需要采用更加复杂的3X3的算子比如Prewitt算子。对于离散的图像f(x,y),边缘检测算子是用图像的垂直和水平差分来逼近梯度算子,即。

qq_44111805的博客 9837

一文看懂MySQL索引下推(ICP)

本文主要介绍MySQL索引下推(ICP)和索引下推底层原理

weixin_46425661的博客 3964

AI agents在公司财务报表分析中的应用

在当今竞争激烈的商业环境中,公司财务报表分析对于企业的决策制定、风险评估、战略规划等方面起着至关重要的作用。传统的财务报表分析方法往往依赖于人工操作,存在效率低下、容易出错、难以处理海量数据等问题。而AI agents作为人工智能领域的重要成果,具有自动化、智能化、高效性等特点,能够为财务报表分析带来新的突破和变革。

SuperAGI2025 1609

Cesium中级开发教程之二十二:视锥体

教程示例网站:https://thomaz529.github.io。

883

MYSQL——索引下推

理解上面的知识后就可以回答以下问题。二级索引取出的数据是依次回表还是一次回表?答:依次回表。索引下推是为了什么发明的?答:减少回表,而不是避免回表(避免回表用覆盖索引)

ksidgx的博客 1716

基于STM32H5的循环GPDMA链表使用

STM32H503的GPDMA链表模式可实现灵活的数据传输。相比传统DMA直接编程方式,链表模式通过配置多个节点实现分散数据传输,支持循环链表功能。示例展示了如何使用GPDMA链表实现UART1循环发送数据:配置两个DMA节点分别指向不同发送缓冲区,构建循环链表并绑定到DMA通道。关键点包括:清空链表结构体、正确设置循环模式、检查节点配置。此方法提高了DMA使用的灵活性,适用于需要交替传输多段数据的场景。

kevin1499的博客 451

MySQL索引下推详解

MySQL索引下推(ICP)是5.6版本引入的查询优化技术,它允许存储引擎在索引扫描阶段应用部分WHERE条件,减少回表次数和I/O开销。当使用二级索引且需要回表时,ICP可将范围查询条件下推到存储引擎层进行过滤,避免将不符合条件的记录读取到服务器层。通过对比测试发现,ICP能使查询性能提升近50%。触发条件包括:使用InnoDB/MyISAM引擎、存在回表操作、查询条件包含索引列范围查询等。ICP默认开启,可通过optimizer_switch参数控制。合理使用ICP可显著提升大表查询性能。

qq_46769552的博客 4621

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

详解MySQL覆盖索引、索引下推

一文聊明白mysql的覆盖索引、索引下推

BugMan的博客 6410

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

MySQL的索引覆盖和索引下推

MySQL的索引覆盖和索引下推

醉逸鎏年的博客 6093

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Mysql-索引下推

MySQL索引下推详细介绍

qq_63366830的博客 1382

MySQL索引下推

索引下推(Index Condition PushDown,简称ICP)是从MySQL5.6开始引入的一个特性,索引下推通过减少回表的次数来提高数据库的查询效率;

xp_xpxp的博客 2957

MySQL的索引下推机制

其中,UNIQUE关键字表示创建唯一索引,index_name表示索引名称,table_name表示表名,column_name表示要创建索引的列名,ASC和DESC表示升序和降序排序,默认为ASC。维护索引的统计信息:MySQL会根据索引的统计信息来选择最优的查询计划,需要定期更新和维护索引的统计信息,以保证查询性能的稳定和可靠。此外,还有Memory存储引擎,它将数据存储在内存中,具有很高的读写速度,但数据仅在服务重启前有效,适用于临时性的数据存储需求。

林隐的博客 2042

MySQL 中 聚集索引、非聚集索引、覆盖索引、索引下推 到底是什么

MySQL 中 聚集索引、非聚集索引、覆盖索引、索引下推 到底是什么。

小毕超博客 1917

【mysql】MySQL中的回表查询、索引覆盖、索引下推、谓词下推

索引下推(INDEX CONDITION PUSHDOWN,简称 ICP)是在 MySQL 5.6 针对扫描二级索引的一项优化改进。总的来说是通过把索引过滤条件下推到存储引擎,来减少 MySQL 存储引擎访问基表的次数以及 MySQL 服务层访问存储引擎的次数。ICP 适用于 MYISAM 和 INNODB,本篇的内容只基于 INNODB。(1)MySQL 服务层:也就是 SERVER 层,用来解析 SQL 的语法、语义、生成查询计划、接管从 MySQL 存储引擎层上推的数据进行二次过滤等等。

weixin_44823875的博客 5878

什么是MySQL的索引覆盖和索引下推?

什么是MySQL的索引覆盖和索引下推?

weixin_47762494的博客 4976

MySQL优化之索引下推

MySQL优化之索引下推

个人博客,欢迎收藏。 1273

MySql 索引覆盖 索引下推

覆盖索引(covering index)指一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取。也可以称之为实现了索引覆盖。当一条查询语句符合覆盖索引条件时,MySQL只需要通过索引就可以返回查询所需要的数据,这样避免了查到索引后再返回表操作,减少I/O提高效率。如,表covering_index_sample中有一个普通索引 idx_key1_key2(key1,key2)。的时候,就可以通过覆盖索引查询,无需回表。但是如果SQL中查询的信息不包含在联合索引中,那么就不会走索引覆盖。

一千个读者就有一千个哈姆雷特 1万+
上一篇: Java 提供了哪些 IO 方式? NIO 如何实现多路复用?
下一篇: 高并发架构设计经验
Java_LingFeng
博客等级 码龄4年 505粉丝 259原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值