10.索引下推

news/2024/9/18 17:29:45/ 标签: sql

10.索引下推

10.1.什么是索引下推?
(1)索引下推 (Index Condition Pushdown, ICP) 是 MySQL 5.6 中新特性,是一种在存储引擎层使用索引过滤数据的一种优化方式。
(2)如果没有 ICP,存储引擎会遍历索引以定位基表中的行,并将它们返回给 MySQL 服务器,由 MySQL 服务器评估 WHERE 后面的条件是否保留行。
(3)启用 ICP 后(一般是默认开启的),如果部分 WHERE 条件可以仅使用索引中的列进行筛选,则 MySQL 服务器会把这部分 WHERE 条件放到存储引擎筛选。然后,存储引擎通过使用索引条目来筛选数据,并且只有在满足这一条件时才从表中读取行。
① 优点:ICP 可以减少存储引擎必须访问基表的次数和 MySQL 服务器必须访问存储引擎的次数。
② 缺点:ICP 的加速效果取决于在存储引擎内通过 ICP 筛选掉的数据的比例。

10.2.索引下推的开启与关闭
(1)默认情况下启用索引条件下推。可以通过设置系统变量 optimizer_switch 控制:

sql"># 关闭索引下推
SET optimizer_switch = 'index_condition_pushdown=off';
# 打开索引下推
SET optimizer_switch = 'index_condition_pushdown=on';

(2)当使用索引条件下推时,EXPLAIN 语句输出结果中 Extra 列内容显示为 Using index condition。

10.3.ICP 的使用条件
(1)只能用于二级索引 (secondary index);
(2)explain显示的执行计划中 type 值(join 类型)为 range 、 ref 、 eq_ref 或者 ref_or_null 。
(3)并非全部where条件都可以用ICP筛选,如果 where 条件的字段不在索引列中,还是要读取整表的记录到 server 端做 where 过滤。
(4)ICP 可以用于 MyISAM 和 InnnoDB 存储引擎
(5)MySQL 5.6 版本的不支持分区表的 ICP 功能,5.7 版本的开始支持。
(6)当 SQL 使用覆盖索引时,不支持 ICP 优化方法。

10.4.案例
(1)单列索引(特殊情况)

sql">USE atguigudb1;EXPLAIN SELECT * FROM s1 WHERE key1 > 'z' AND key1 LIKE '%a';

以上面的 SQL 语句为例,开启 ICP 后,在使用二级索引 idx_key1 的情况下,假设通过查询条件 key1 > ‘z’ 过滤得到了 1000 条记录(注意这里并不是完整的记录,只是包括索引列+主键,即 key1 + id),此时先不着急回表,而是在后面的查询语句 key1 LIKE ‘%a’ 的基础上,对这 1000 条记录再次进行过滤,假设只剩下 100 条记录,此时再根据 id 进行回表操作查找完整的记录即可。

(2)联合索引(普遍情况)

USE atguigudb1;

sql"># 建立 people 表
CREATE TABLE `people`(
`id` INT NOT NULL AUTO_INCREMENT,
`zipcode` VARCHAR(20) COLLATE utf8_bin DEFAULT NULL,
`firstname` VARCHAR(20) COLLATE utf8_bin DEFAULT NULL,
`lastname` VARCHAR(20)COLLATE utf8_bin DEFAULT NULL,
`address` VARCHAR(50) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`id `),
# 建立联合索引
KEY `zip_last_first`(`zipcode`, `lastname`, `firstname`)
)ENGINE=INNODB AUTo_INCREMENT=5 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin;

插入数据

sql">INSERT INTO `people` VALUES
('1', '000001', '三', '张', '北京市'),
('2', '000002', '四', '李', '南京市'),
('3', '000003', '五', '王', '上海市'),
('4', '000001''六', '赵', '天津市');
sql">EXPLAIN SELECT * FROM people 
WHERE zipcode='000001'
AND lastname LIKE '%张%'
AND address LIKE '%北京市%';

① 由上面的查询计划可知,key_len = 63,这说明索引 zip_last_first 中只有索引列 zip 被使用了(like 以通配符 % 开头索引失效)。

② 开启 ICP 后,在使用二级索引(联合索引) zip_last_first 的情况下,假设通过查询条件 zipcode = ‘000001’ 过滤得到了 1000 条记录(注意这里并不是完整的记录,只是包括索引列+主键,即 zipcode, lastname, firstname + id),此时先不着急回表,而是在后面的查询语句 lastname LIKE ‘%张%’ 的基础上,对这 1000 条记录再次进行过滤,假设只剩下 100 条记录,而此时由于字段 address 不在 zipcode, lastname, firstname + id 中,所以无法再次过滤,此时再根据 id 进行回表操作查找完整的记录即可。

③ 如果关闭 ICP,在使用二级索引(联合索引) zip_last_first 的情况下,假设通过查询条件 zipcode = ‘000001’ 过滤得到了 1000 条记录,此时会直接回表,根据 id 查询到完整的记录,然后再根据后面的 2 个查询条件进行过滤。其缺点就比较明显,如果通过查询条件 zipcode = ‘000001’ 过滤得到的记录数非常大(比如有几百万条),那么此时直接全部回表的效率会比较低。

④ 注:具体 key_len 的计算可以查看MySQL高级篇知识点——性能分析工具的使用这篇文章的第 6.4.7 节,key_len = 63 的由来如下:
varchar(20) 变长字段且允许 NULL = 20 * (character set:utf8 = 3, gbk = 2, latin1 = 1) + 1(NULL) + 2(变长字段) = 20 * 3 + 1 + 2 = 63

10.5.开启/关闭索引下推的性能对比
10.5.1.准备数据

sql"># 创建存储过程,向 people 表中添加 1000000 条数据,测试 ICP 开启和关闭状态下的性能
DELIMITER //
CREATE PROCEDURE insert_people (max_num INT)
BEGINDECLARE i INT DEFAULT 0;SET autocommit = 0;REPEATSET i = i + 1;INSERT INTO people (zipcode, firstname ,lastname, address ) VALUES ('000001', '六', '赵', '天津市');UNTIL i = max_numEND REPEAT;COMMIT;
END //
DELIMITER;
sql"># 调用存储过程,插入 1000000 条数据
CALL insert_people(1000000);

10.5.2.性能对比
(1)打开 profiling。

sql">set profiling = 1;

(2)执行 SQL 语句,此时默认打开索引下推。

sql">SELECT * FROM people WHERE zipcode='008801' AND lastname LIKE '%张%';

(3)再次执行 SQL 语句,不使用索引下推(也可通过设置 optimizer_switch 来关闭索引下推)。

sql">SELECT /*+ no_icp (people) */ * FROM people WHERE zipcode=' e88801' AND lastname LIKE '%张%' ;

1

(4)查看 profiles。

对比结果可知,开启 ICP 后查询所消耗的时间明显少于关闭 ICP 的!


http://www.ppmy.cn/news/1526743.html

相关文章

设计模式---中介者模式

设计模式---中介者模式 定义与设计思路中介者模式的引入:机场控制塔中介者模式的设计框架 定义与设计思路 定义:用一个中介对象来封装一系列对象交互。中介者使各对象不需要相互引用,从而使其耦合松散,而且可以独立地改变它们之间…

CISP-PTE CMS sqlgun靶场

sql靶场有个搜索框先点一下go,有回显说明存在漏洞 有个xss 然后在这里尝试sql注入 输入 -1 union select 1,2,3# 有回显可以查看数据库 然后查询数据库,用户 查询数据库的表名 查询它的数据这里admin用户的密码是md5加密 去解密看看 然后扫描ip目录发…

【ShuQiHere】 进位回补与溢出问题全解:二补码与一补码的进阶指南

【ShuQiHere】 在现代计算机系统中,数值运算的准确性和效率至关重要。无论是整数的加法还是减法,在处理负数、符号位和进位问题时,都可能遇到 进位回补(End-Around Carry) 和 溢出(Overflow) 等…

python Open3D 验证安装崩溃

环境 Win11 python 3.11.9 numpy 2.1.1 问题 根据官方指南安装了python的open3d库,但是在验证安装的时候,总是崩溃,详细内容参考GitHub Issue # Python API python -c "import open3d as o3d; \mesh o3d.geometry.TriangleMesh.cre…

Netty笔记06-组件ByteBuf

文章目录 概述ByteBuf 的特点ByteBuf的组成ByteBuf 的生命周期 ByteBuf 相关api1. ByteBuf 的创建2. 直接内存 vs 堆内存3. 池化 vs 非池化4. ByteBuf写入代码示例 5. ByteBuffer扩容6. ByteBuf 读取7. retain() & release()TailContext 释放未处理消息逻辑HeadContext 8. …

基于kolla-ansible在openEuler 22.03 SP4上部署OpenStack-2023.2

测试环境 openEuler-22.03-LTS-SP4-x86_64-dvd.iso Virtual Box,4 vCPU, 8G RAM, 50 vDisk。安装时删除/home,SWAP分区,全部空间给/目录。 目标是部署OpenStack All-In-One模式,控制节点计算节点存储节点在一台机器实现。 系统配…

有哪些方法可以减少脏页标记技术中的磁盘 I/O 操作?

减少脏页标记技术中磁盘 I/O 操作的方法 一、引言 在数据库系统中,脏页标记技术用于跟踪被修改但尚未写入磁盘的数据页。然而,频繁的磁盘 I/O 操作会严重影响数据库的性能。因此,寻找有效的方法来减少脏页标记技术中的磁盘 I/O 操作至关重要。 二、优化脏页标记策略 (一…

Axure设计之全屏与退出全屏交互实现

在Axure RP中,设计全屏与退出全屏的交互功能可以极大地提升用户体验,尤其是在展示产品原型或进行演示时。本文将详细介绍如何在Axure RP中通过结合JavaScript代码实现全屏与退出全屏的交互效果。 ​ Axure原型设计web端交互元件库:https://…

【系统架构设计师】建造者模式(Builder Pattern)

建造者模式详解 1. 什么是建造者模式? 建造者模式(Builder Pattern)是一种创建型设计模式,它允许通过分步构造复杂对象,而无需知道对象内部的具体实现细节。换句话说,建造者模式将对象的创建过程抽象出来,分离对象的构建和表示,使得同样的构建过程可以创建不同类型的…

什么是大模型的推理?

目录 1. 大模型的推理过程原理 2. 简单生动的例子说明大模型推理 3. 学习大模型推理的最好办法 1. 大模型的推理过程原理 大模型的推理过程主要是基于海量数据的训练,来生成或预测出最可能的输出。以语言模型为例,它是通过输入一段文本(称…

请求响应-05.请求-日期参数JSON参数

一.日期参数 当浏览器发起的请求参数类型是日期参数时,我们通常使用LocalDateTime对象来接收,前面使用DateTimeFormat注解来完成日期的格式转换(日期时间格式有多种,需要哪种就设置为哪种:如yyyy-MM-dd HH:mm:ss&…

基于python+django+vue的鲜花商城系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的线…

Charles mac电脑配置

安装 Charles: 如果你还没有安装 Charles,可以从官方网站下载安装包并按照提示完成安装。 启动 Charles: 安装完成后,启动 Charles 应用程序。 设置 Charles 代理: Charles 默认的代理端口是 8888。你可以通过以下步…

flink增量检查点启动恢复的时间是很久的,业务上不能接受,怎么处理

可以考虑以下几种优化策略和替代方案,以减少恢复时间或提高业务的容忍度: 1. 优化增量检查点恢复时间 a. 合并增量检查点 定期将多个增量检查点合并为一个完整的检查点。合并增量检查点可以减少恢复时需要处理的增量数量,从而加快恢复速度。…

论文速递! Attention-LSTM特征融合,用于剩余使用寿命(RUL)预测

论文标题:Machine Remaining Useful Life Prediction via an Attention-Based Deep Learning Approach 期刊信息:IEEE TIE (中科院1区, JCR Q1 TOP, IF7.5) 引用:Chen Z, Wu M, Zhao R, et al. Machine remaining useful life prediction v…

速通汇编(五)认识段地址与偏移地址,CS、IP寄存器和jmp指令,DS寄存器

一,地址的概念 通常所说的地址指的是某内存单元在整个机器内存中的物理地址,把整个机器内存比作一个酒店,内存单元就是这个酒店的各个房间,给这些房间编的门牌号,类比回来就是内存单元的物理地址 在第一篇介绍debug的…

RK3568 android11 usb摄像头预览分辨率添加多分辨率---解除1080p限制

一,描述 UVC(USB Video Class)是一种 USB 设备类标准,允许通过 USB 连接的视频设备(如摄像头、网络摄像头和其他视频捕捉设备)与计算机或其他主机设备进行通信。UVC 使得视频设备的使用变得更加简单和通用…

基于单片机的超声波液位检测系统(论文+源码)

1总体设计 本课题为基于单片机的超声波液位检测系统的设计,系统的结构框图如图2.1所示。其中包括了按键模块,温度检测模块,超声波液位检测模块,显示模块,蜂鸣器等器件设备。其中,采用STC89C52单片机作为主…

【webpack4系列】webpack进阶用法(三)

文章目录 自动清理构建目录产物PostCSS插件autoprefixer自动补齐CSS3前缀移动端CSS px自动转换成rem静态资源内联多页面应用打包通用方案使用sourcemap提取页面公共资源基础库分离利⽤ SplitChunksPlugin 进⾏公共脚本分离利⽤ SplitChunksPlugin 分离基础包利⽤ SplitChunksPl…

【C++】——list

文章目录 list介绍和使用list注意事项 list模拟实现list和vector的不同 list介绍和使用 在C中,list是一个带头双向链表 list注意事项 迭代器失效 删除元素:当使用迭代器删除一个元素时,指向该元素的迭代器会失效,但是不会影响其他…