什么是回表、索引覆盖、索引下推【重点】

参考链接
【1】https://xiaolincoding.com/mysql/index/index_interview.html#%E6%8C%89%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%88%86%E7%B1%BB
【2】https://www.toutiao.com/article/7095749260137726476/?wid=1709192807222
【3】https://zhuanlan.zhihu.com/p/401198674
【4】https://docs.pingcode.com/ask/39637.html
【5】https://blog.csdn.net/luxiaoruo/article/details/106637231

按照四个角度来分类索引。

  1. 按「数据结构」分类:B+tree索引、Hash索引、Full-text索引。
  2. 按「物理存储」分类:聚簇索引(主键索引)、二级索引(辅助索引)。
  3. 按「字段特性」分类:主键索引、唯一索引、普通索引、前缀索引。
  4. 按「字段个数」分类:单列索引、联合索引。

要知道什么是回表、索引覆盖、索引下推,首先大概理解B+树

B+树

主键索引:叶子节点中存储了全部元素的索引
二级索引:叶子节点中只存储了当前索引字段和主键ID

主键索引的 B+Tree

之前在讲MVCC时提到过,再次加深印象
InnoDB主键索引【聚簇索引】的叶子节点存储行记录,因此, InnoDB必须要有,且只有一个聚集索引:
(1)如果表定义了主键,则PK就是聚集索引;
(2)如果表没有定义主键,则第一个非空唯一索引(not NULL unique)列是聚集索引;
(3)否则,InnoDB会创建一个隐藏的row-id作为聚集索引;

如图所示(图中叶子节点之间实际上是双向链表):
补充:【B+Tree 相比于 B 树和二叉树来说,最大的优势在于查询效率很高,因为即使在数据量很大的情况,查询一个数据的磁盘 I/O 依然维持在 3-4次。】

在这里插入图片描述

============================================================================

主键索引的 B+Tree 和二级索引的 B+Tree 区别如下:

  1. 主键索引的 B+Tree 的叶子节点存放的是实际数据,所有完整的用户记录都存放在主键索引的 B+Tree 的叶子节点里
  2. 二级索引的 B+Tree 的叶子节点存放的是主键值,而不是实际数据。

二级索引的 B+Tree
(图中叶子节点之间实际上是双向链表)
在这里插入图片描述

大概理解的B+树的主键索引和二级索引,就比较好理解回表、索引覆盖和索引下推了

回表

在MySQL中,回表(Index Lookups)是指在 使用二级索引(Secondary Index)进行查询时,(没有得到想要的全部结果),就需要根据该索引的键值去主键索引(Primary Index)中查找对应的数据行的过程。

写一个会回表查询的SQL:
select id, name, age from index_opt_test where name=‘cc’ ;
解析:

​SQL需要查询的列包括 id、name、age、使用name='cc’二级索引,但是这时候只能得到 id 和 name的值,但是age不能通过这次索引获取到。这时候只能通过 id 主键索引 获取到整行数据之后再从结果中捞出来age列的数据,这个额外的通过主键索引查找数据的过程就是回表

回表操作可能导致额外的IO开销,影响查询性能,特别是当查询的列不包含在二级索引中。为了优化查询性能,可以使用覆盖索引(Covering Index)和索引下推(Index Condition Pushdown)技术来避免回表操作,提高查询效率。

索引覆盖。

当所有的列都能在二级索引树中查询到,就不需要再回表,这种情况就是索引覆盖。简单点来讲就是:所有不需要回表的查询操作都叫索引覆盖。

select id,name from user where name=‘shenjian’;
因为通过name='shenjian’就可以查询到id,name字段,无需回表,所以是索引覆盖。

实现索引覆盖:

  1. select id,name from user where name=‘shenjian’;

create table user (
id int primary key,
name varchar(20),
sex varchar(5),
index(name) 单列索引
)engine=innodb;

  1. 建立 联合索引
    select id,name,sex from user where name=‘shenjian’;

create table user1 (
id int primary key,
name varchar(20),
sex varchar(5),
index(name, sex) 联合索引,
)engine=innodb;

单列索升级为联合索引(name, sex)后,索引叶子节点存储了主键id,name,sex,都能够命中索引覆盖,无需回表。

下面这个查询SQL该怎么建联合索引?
select a from table where b = 1 and c = 2;
刚才在讲联合索引的时候已经说了这个知识点了,where条件有b和c的等值查询,联合索引就建成(b,c),由于select后面有a,我们就建立 (b,c,a) 的联合索引,并且可以用到覆盖索引,查询速度更快。

索引下推(ICP优化)

在需要进行 联合索引 的时候,使用ICP可以对联合索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少存储引擎访问基础表的次数和Server访问存储引擎的次数,(减少回表次数)。

ICP 适用的一个隐含前提是二级索引必须是联合索引、且在使用索引进行扫描时只能采用最左前缀匹配原则。组合索引后面的列出现在 where 条件里,因此可以先过滤索引元组、从而减少回表读的数量。

例子:
SQL语句:(联合索引)
select id, name, sex,age from user where name=‘cc’ and sex=‘male’ and age>20;

没有开启索引下推的过程如下:

  1. 数据库接收到查询请求后,解析查询语句,确定需要访问的数据表为"user"表。 Server层把name推到引擎层
  2. 存储引擎会扫描整个"user"表,根据“最左前缀原则”,引擎层根据二级索引name找到主键, 存储引擎将满足条件的数据行返回给Server层。(回表)
  3. Server层再根据sex、age筛选出最终的数据。
  4. 最后返回给客户端

开启了索引下推后的过程如下:

  1. 数据库接收到查询请求后,解析查询语句,并确定需要访问的数据表。Server层会将name=‘cc’、sex=‘male’ 和 age=20 下推到存储引擎
  2. 存储引擎根据下推的条件,利用姓名、性别和年龄字段的索引,直接定位到符合条件的数据行。
  3. 符合条件的数据行将被返回给Server层。(回表)
  4. Server层收到数据后,将数据返回给客户端。

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

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

相关文章

算法沉淀——动态规划之两个数组的 dp(下)(leetcode真题剖析)

算法沉淀——动态规划之两个数组的 dp 01.正则表达式匹配02.交错字符串03.两个字符串的最小ASCII删除和04.最长重复子数组 01.正则表达式匹配 题目链接:https://leetcode.cn/problems/regular-expression-matching/ 给你一个字符串 s 和一个字符规律 p&#xff0c…

产品经理岗位的任职资格和职业规划

产品经理主要是商业银行以客户为导向的,具体负责组织银行某一金融产品线的创新设计、生产营销和管理服务的工作。这类人士主要负责应用实施工作,其中产品线由一系列的产品构成,公司的产品经理主要分为全过程产品创新设计专家、全过程产品生产…

武汉灰京文化:跨平台和云游戏,手游行业的未来发展趋势

随着科技的不断进步和智能设备的普及,手游行业正迎来新的发展机遇。武汉灰京文化认为,在这个过程中,跨平台游戏和云游戏作为两大关键技术将推动手游行业迈向更加丰富、便捷和多元化的发展。 跨平台游戏的出现将为玩家带来全新的游戏体验。在…

java常用环境docker安装

配置目录 rocketmqredismysql不配置binlog配置binlog Nacoszookeeper 本文为精简安装,部分不带容器卷映射,仅供以学习使用。 rocketmq nameservice sudo docker run -d \ --privilegedtrue \ --name rmqnamesrv \ -p 9876:9876 \ -e "MAX_HEAP_SI…

visio、ppt、office等另存图片,如何设置更清晰

visio、ppt、office等另存图片,如何设置更清晰 选中要另存为的部分——文件——另存为——选好位置——格式选jpg——保存——按下图设置:质量100%,分辨率选打印机,大小选屏幕——确定

android开发前景2019,android高级面试framework

到底是公司养活了我,还是我养活了公司? 1. 很难在一家公司干到退休 在我父母那一代,一个上班的职工,往往可以在一家单位干到退休,名副其实的“铁饭碗”。甚至更早之前的年代,职工的子女还可以接父母的班&a…

计算机专业大学四年应该如何规划(Java方向)

计算机专业的学生,如何在大学四年内提高自己的竞争力,毕业之后直接进大厂工作? 以下将从大学四年计算机专业的学习规划、课程设置、能力提升、参考书籍等方面,为同学们提供一些建议和指导。 大一: 主攻技能学习并且达…

数据结构之数组

一、定义 数组(Array)是一种用连续的内存空间存储相同数据类型数据的线性数据结构。 二、内存结构 1.创建数组 我们创建一个数组 int[] array {22,33,88,66,55,25} ,在内存结构如下图所示: 首先创建了array数组,会…

Node.js基础---npm与包

包 概念:Node.js 中的第三方模块又叫做包 来源:由第三方个人或团队开发出来的,免费使用,且为开源 为什么需要:Node.js的内置模块只有一些底层API,开发效率低 包是基于内置模块封装出来的,提供更…

python实现跨进程(跨py文件)通信01

前言 项目中总会遇到数据需要跨进程通信的问题,今天就给大家带来一套简单的跨进程通信代码。代码分为服务端与客户端两部分。 一、server端 import multiprocessing import timedef do_socket(conn, addr, ):try:while True:if conn.poll(1) False:time.sleep(0…

ZCANPRO基础操作流程

硬件准备 测试单关节需要准备如下工具: 电源: 推荐使用20-27V直流电源。关节峰值功率为额定功率的三倍。 CAN卡: 推荐使用周立功USB转CANFD卡,我们的单关节测试软件适配了该型号CAN卡驱动。 WHJ系列关节模组 WHJ系列关节模组包含…

2024最新大厂Android面试真题解析,三年老Android经验面经

前言 不知道大家面试的时候,有没有遇到这种情况,面试工资谈的是10K,最后干着40K的活!说着冠冕堂皇,提升大家能力的话,做着死命压榨员工,996成了程序员心里的魔咒! 初级安卓开发工程…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的活体人脸检测系统(Python+PySide6界面+训练代码)

摘要:本篇博客详细讲述了如何利用深度学习构建一个活体人脸检测系统,并且提供了完整的实现代码。该系统基于强大的YOLOv8算法,并进行了与前代算法YOLOv7、YOLOv6、YOLOv5的细致对比,展示了其在图像、视频、实时视频流和批量文件处…

CSS_实现三角形和聊天气泡框

如何用css画出一个三角形 1、第一步 写一个正常的盒子模型&#xff0c;先给个正方形的div&#xff0c;便于观察&#xff0c;给div设置宽高和背景颜色 <body><div class"box"></div> </body> <style>.box {width: 100px;height: 100px…

常用git 打tag命令

1.查看所有tag git tag 2.创建 v5.0.0的tag git tag v5.0.0 git tag &#xff08;创建后查看&#xff09; 3.推送到远程tag git push origin v5.0.0 4.删除远程tag git push origin --delete v5.0.0 5.删除本地tag git tag -d v5.0.0 6.添加带有备注信息的tag git tag v5.…

Java反射机制底层原理

反射机制 这篇文章我是参考了Java 中的反射机制&#xff08;两万字超全详解&#xff09;_java反射-CSDN博客 然后我在这里做一下总结&#xff0c;因为原文章真的很好&#xff0c;我才疏学浅没什么进行补充&#xff0c;只能做出自己的总结并且写一下自己对这个的理解。 原理&…

配置artifactory的反向代理和域名访问

一、概述 在许多情况下&#xff0c;组织会通过反向代理来提供对 Artifactory 的访问。在某些情况下&#xff0c;例如使用 Artifactory 作为 Docker 注册表&#xff0c;这种设置甚至是强制性的。为了简化反向代理的配置&#xff0c;Artifactory 提供了生成反向代理的功能&#x…

spring boot学习第十三篇:使用spring security控制权限

该文章同时也讲到了如何使用swagger。 1、pom.xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instanc…

vue - - - - - vue3使用draggable拖拽组件

vue3使用draggable拖拽组件 一、组件安装二、插件使用三、遇到的问题1. missing required prop&#xff1a; “itemKey” 一、组件安装 yarn add vuedraggablenext // or npm i -S vuedraggablenext二、插件使用 <template><draggableitem-key"id"class&q…

吴恩达机器学习笔记十三 多分类问题(multiclass) Softmax 神经网络的softmax输出 softmax改进

多分类问题指可能会有多于两个的输出标签&#xff0c;而不只是0或1的问题。 Softmax算法是逻辑回归的一种推广。 例如 y 有四种可能的取值时&#xff1a; 成本函数 例如有十种类别的输出&#xff0c;此时称这个神经网络有一个softmax输出层或上层是softmax层 softmax layer有…