MySQL 中的索引下推功能

看到索引,应该大家都可以联想到这个是和查询效率有关系的,既然有这个功能,那么那句古话说的好啊:存在即合理。那么这个就是说有了这个功能,可以提升查询效率。

什么是索引下推

我们先有一个大概的理解:在 MySQL 中,索引下推(Index Condition Pushdown,简称 ICP)是一种优化技术,就是为了提高有索引表的查询性能

索引下推主要的目的是:在索引扫描过程中尽可能减少回表操作(所谓回表:是指索引中返回数据行到服务器层进行进一步过滤),从而提高查询效率。

原理

没有索引下推时

在没有索引下推的情况下,存储引擎通过索引检索到数据行后,会将数据行返回给服务器层,服务器层再根据 WHERE 条件中的其他条件(非索引条件)进行过滤判断。

有索引下推时

而有了索引下推,存储引擎在检索索引的过程中,就可以根据 WHERE 条件中的其他条件对索引中包含的数据进行判断过滤,只有符合条件的数据行才会被返回给服务器层。这样可以减少存储引擎返回给服务器层的数据行数,以及服务器层后续进行过滤判断的工作量。

这里我们看下存储引擎层和服务层的区别:
服务层和存储引擎层

看下这个图之后,应该大家都可以理解了,执行顺序是:
调用逻辑
总结一下哈:索引下推其实就是说,将过滤的行为传到了存储引擎层中,先在存储引擎层处理一遍,然后再返回给服务层。

为啥我感觉这个应该是理所当然的事情啊,好在这个功能现在已经是具备了。

使用场景示例

假设有一个表 users,这里我建了一个 age 和 city 的组合索引,其结构如下:

CREATE TABLE users (  id INT PRIMARY KEY,  name VARCHAR(100),  age INT,  city VARCHAR(100),  INDEX idx_age_city (age, city)  
);

如果执行以下查询:

SELECT * FROM users WHERE age BETWEEN 20 AND 30 AND city = 'New York';

在没有索引下推的情况下,MySQL 会扫描 idx_age_city 索引,找到所有 age 在 20 到 30 之间的记录,然后将这些记录返回给服务器层,服务器层再对这些记录进行 city = 'New York' 的过滤。

而在启用了索引下推的情况下,MySQL 会在存储引擎层就进行 city = 'New York' 的过滤,只有满足 age BETWEEN 20 AND 30city = 'New York' 的记录才会被返回给服务器层。

如何判断是否使用了索引下推

要确认查询是否使用了索引下推,可以使用 EXPLAIN 语句来查看查询的执行计划。在执行计划中,如果使用了索引下推,会在 Extra 列中看到 Using index condition

EXPLAIN SELECT * FROM users WHERE age BETWEEN 20 AND 30 AND city = 'New York';

如果执行计划中的 Extra 列显示 Using index condition,则说明该查询使用了索引下推优化。

索引下推带来的好处

  • 提高查询性能
    • 减少了存储引擎和服务器层之间的数据传输量,尤其是在表数据量很大、WHERE 条件比较复杂的情况下,性能提升效果更为明显。
    • 降低了服务器层的 CPU 开销,因为服务器层需要处理的数据行数减少了。
  • 优化复杂查询
    • 对于多表连接查询,如果连接列上有索引并且可以使用索引下推,也能提高连接查询的性能。

注意事项

索引下推是 MySQL 5.6 及以上版本引入的功能,因此在较低版本的 MySQL 中无法使用。

索引下推并不能替代所有情况下的回表操作,但对于某些查询模式,它可以显著减少回表操作的次数,从而提高查询性能。

索引下推与覆盖索引(covering index)不同,覆盖索引是指索引包含了查询所需的所有列,从而避免了回表操作。索引下推则是在索引扫描过程中进行部分条件的过滤,以减少回表操作的次数。

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

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

相关文章

#渗透测试#SRC漏洞挖掘# 操作系统-Linux系统之基本命令、资源耗尽脚本编写

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…

软考中级 软件设计师 上午考试内容笔记(个人向)Part.1

软考上午考试内容 1. 计算机系统 计算机硬件通过高/低电平来模拟1/0信息;【p进制】: K n K n − 1 . . . K 2 K 1 K 0 K − 1 K − 2... K − m K n r n . . . K 1 r 1 K 0 r 0 K − 1 r − 1 . . . K − m r − m K_nK_{n-1}...K_2K_1K_0K…

IDA*算法 Power Calculus————poj 3134

目录 闲聊 前言 DFS算法的无效搜索 BFS算法的空间浪费 IDDFS A*算法 IDA* Power Calculus 问题描述 输入 输出 问题分析 代码 闲聊 前几周在忙着数学竞赛,所以就没时间更新,高等数学,一生之敌,真不知道报名的时候我是怎么想…

基于python深度学习技术矩阵分解的推荐系统,通过学习隐含特征,实现推荐

实现了一个基于矩阵分解的推荐系统,用于预测用户对电影的评分。具体来说,该程序通过TensorFlow构建和训练一个模型,来学习用户和电影之间的隐含特征,并根据这些特征预测评分。以下是代码的主要功能和步骤的详细描述: …

C++高级编程(8)

八、标准IO库 1.输入输出流类 1)非格式化输入输出 2)put #include <iostream> #include <string> ​ using namespace std; int main() {string str "123456789";for (int i str.length() - 1; i > 0; i--) {cout.put(str[i]); //从最后一个字符开…

EMC Plus:大电流注入传导抗扰度

大电流注入 &#xff08;BCI&#xff09; 是一种传导射频抗扰度测试&#xff0c;利用电流注入探头将调制信号引入电缆。其目的是复制设备运行环境中预期的电磁干扰 &#xff08;EMI&#xff09; 条件。在这里&#xff0c;我将为您提供一个使用 Ansys EMC Plus 进行大电流注入传…

《Java核心技术 卷I》JFrame组件中显示信息

组件中显示信息 JFrame结构复杂&#xff0c;由四层窗格&#xff0c;其中根窗格、层级窗格和玻璃窗格人们并不太关心&#xff0c;他们要用来组织菜单栏和内容窗格以及实现观感&#xff0c;Swing程序员最关心的是内容窗格(content pane)&#xff0c;添加到窗体的所有组件都会自动…

0x00基础算法 -- 0x01 位运算

资料来源&#xff1a;算法竞赛进阶指南活动 - AcWing 1、进制表示 二进制表示&#xff1a;m位二进制中&#xff0c;通常称最低位为第0位&#xff0c;从右到左以此类推&#xff0c;最高位为第m-1位。 常用十六进制表示的数字&#xff1a; 32位补码int&#xff08;十进制&#xf…

算法求解(C#)-- 寻找包含目标字符串的最短子串算法

1. 引言 在字符串处理中&#xff0c;我们经常需要从一个较长的字符串中找到包含特定目标字符串的最短子串。这个问题在文本搜索、基因序列分析等领域有着广泛的应用。本文将介绍一种高效的算法来解决这个问题。 2. 问题描述 给定一个源字符串 source 和一个目标字符串 targe…

Linux之Chronyd 时间服务器配置(Chronod Time Server Configuration in Linux)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

【Ant Design Pro】如何实现组件的状态保存umi-plugin-keep-alive插件的使用

都知道vuejs里面帮我们实现了一个内置的keep-alive组件&#xff0c;给我们缓存一些组件的状态带来了很大的便利。但是在react中没有自带的实现&#xff0c;可以借助社区的插件umi-plugin-keep-alive来实现这个功能。 实现效果对比 未使用插件&#xff0c;可以看到我们在页面跳…

【数据结构】二叉排序树和平衡二叉树

目录 1. 二叉搜索树&#xff08;BST&#xff09; 1.1 二叉搜索树的定义及特点 1.1.1 定义 1.1.2 特点 1.2 二叉排序树的构造&#xff08;创建&#xff09; 1.2.1 基本思想 1.2.2 算法 1.3 二叉排序树的删除 2. 平衡二叉树&#xff08;AVL&#xff09; 2.1 为什么要用…

C++四种类型转换

C语言提供了四种类型转换 const_cast: 可以去除掉常量属性的类型转换 //const_cast const int a 10; double* p1 (double*)&a;//类型和原来的类型可以不一致&#xff0c;但是不安全 int* p2 const_cast<int*>(&a);//类型和原本的类型必须匹配 //<>中必…

【SPIE出版,往届稳定EI检索】2024智能视觉与数据建模国际学术会议(ICIVD 2024,12月13-15日)

2024智能视觉与数据建模国际学术会议 2024 International Conference on Intelligent Vision and Data modeling (ICIVD 2024) 重要信息 会议官网&#xff1a;www.iccaid.net 2024 International Conference on Intelligent Vision and Data modeling (ICIVD 2024)www.iccaid…

大模型的思维链提示

文章目录 思维链提示的基本形式思维链提示的优化策略关于思维链的进一步讨论思维链提示是一种高级提示策略,旨在增强大语言模型在各类复杂推理任务上的表现。常见的推理任务包括算术推理、常识推理以及符号推理等多种任务。与上下文学习方法仅使用⟨输入,输出⟩二元组来构造提…

JavaScript day01 笔记

一、引入方式 JavaScript 程序不能独立运行&#xff0c;它需要被嵌入 HTML 中&#xff0c;然后浏览器才能执行 JavaScript 代码。通过 script 标签将 JavaScript 代码引入到 HTML 中 1️⃣内部 通过 script 标签包裹 JavaScript 代码&#xff08;一般就写在</script>的…

vue,uniapp,微信小程序解决字符串中出现数字则修改数字样式,以及获取字符串中的数字

简单记录一下&#xff0c;最近遇到的一个新需求&#xff1a;后端返回的是非富文本&#xff0c;只是一串字符串&#xff0c;其中包含了文字和数字&#xff0c;前端需要将出现数字的地方将其加粗或者修改颜色等需求 设计思路&#xff1a;&#xff08;简单做个记录方便以后理解&a…

数据分析:16s差异分析DESeq2 | Corncob | MaAsLin2 | ALDEx2

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍DESeq2原理计算步骤结果Corncob原理计算步骤结果MaAsLin2原理计算步骤结果ALDEx2原理计算步骤结果加载R包数据链接数据预处理微生物数据样本信息提取物种名称过滤零值保留结果读取…

【CSS】标准怪异盒模型

概念 CSS 盒模型本质上是一个盒子&#xff0c;盒子包裹着HTML 元素&#xff0c;盒子由四个属性组成&#xff0c;从内到外分别是&#xff1a;content 内容、padding 内填充、border 边框、外边距 margin 盒模型的分类 W3C 盒子模型(标准盒模型) IE 盒子模型(怪异盒模型) 两种…

C++builder中的人工智能(18):神经网络中的SoftMax函数

在这篇文章中&#xff0c;我们将探讨SoftMax函数在神经网络中的作用&#xff0c;如何在人工神经网络&#xff08;ANN&#xff09;中使用SoftMax函数&#xff0c;以及在AI技术中SoftMax的应用场景。让我们来详细解释这些概念。 SoftMax函数是什么&#xff1f; SoftMax函数是逻辑…