深入理解MySQL InnoDB中的B+索引机制

目录

一、InnoDB中的B+ 树索引介绍

二、聚簇索引

(一)使用记录主键值的大小进行排序

 页内记录排序

页之间的排序

目录项页的排序

(二)叶子节点存储完整的用户记录

 数据即索引

自动创建

(三)聚簇索引的优缺点

三、二级索引

(一)二级索引的特点

基于非主键列排序

叶子节点存储部分数据

(二)二级索引的工作流程

(三)二级索引的优缺点

四、联合索引

(一)联合索引的特点

多列排序规则

联合索引的组成

(二)联合索引与单列索引的区别

联合索引

单列索引

(三)联合索引的优缺点

(四)联合索引的使用建议

五、总结

 参考文献、书籍及链接


干货分享,感谢您的阅读!

在现代数据库系统中,索引是提高数据检索速度的关键机制之一。InnoDB作为MySQL的默认存储引擎,采用了高效的B+树结构来实现其索引功能。这种结构不仅确保了数据的快速检索,还支持高效的插入、更新和删除操作。理解InnoDB中的B+树索引对于数据库优化和性能调优至关重要。

为了更好地理解 InnoDB 中 B+ 树索引的工作机制,我们从创建一个示例表index_demo开始,并通过详细的示意图展示记录在页中的存储结构及索引的作用。

CREATE TABLE index_demo (c1 INT,c2 INT,c3 CHAR(1),PRIMARY KEY (c1)
) ROW_FORMAT = Compact;

这个表中有两个 INT 类型的列 c1c2,一个 CHAR(1) 类型的列 c3,并且 c1 列为主键。表的行格式为 Compact。其基础可见:

一、InnoDB中的B+ 树索引介绍

B+ 树索引是一种自平衡的树结构,其节点分为内部节点和叶子节点:

  • 内部节点(Internal Nodes):用于索引导航,存储键值和指向子节点的指针。
  • 叶子节点(Leaf Nodes):存储实际的数据记录或指向数据记录的指针(称为记录指针)。

在 B+ 树中,所有的数据记录都存储在叶子节点中,而内部节点仅用于存储键值和导航信息。

不论是存放用户记录的数据页,还是存放目录项记录的数据页,我们都把它们存放到B+树这个数据结构中,所以我们也称这些数据页为节点。

从图中可以看出来,我们的实际用户记录都存放在B+树的最底层的节点上,这些节点也被称为叶子节点或叶节点,其余用来存放目录项的节点称为非叶子节点或者内节点,其中B+树最上面的那个节点也称为根节点。

依据InnoDB存储引擎B+树的树高推导当树高为4时,可以存放200百多亿行数据。这样的数据容量,可以满足绝大部分应用的需求,因此我们可以说在绝大部分应用中,B+树高度为3或4就可以满足数据存储的需求。B+树这种高扇出低树高的特征,也大大的提高了主键查询性能。

二、聚簇索引

在InnoDB存储引擎中,聚簇索引(Clustered Index)是数据存储和索引的一种特殊而重要的结构。聚簇索引主要特点:

(一)使用记录主键值的大小进行排序

聚簇索引通过主键值对记录和页进行排序,这涉及三个方面:

 页内记录排序

在每个页内,记录按照主键值的大小顺序排成一个单向链表,确保了页内记录的有序性,方便快速查找。页内的记录被划分成若干个组,每个组中主键值最大的记录在页内的偏移量会被当作槽依次存放在页目录中(当然Supermum记录比任何用户记录都大),我们可以在页目录内通过二分法定位到主键列等于某个值的记录。

页之间的排序

存放用户记录的页按照页内记录的主键大小顺序排成一个双向链表。这种结构使得范围查询和顺序扫描更加高效。

目录项页的排序

存放目录项记录的页根据页内目录项记录的主键大小顺序排成一个双向链表。不同层次的页同样遵循这种排序规则,确保树的平衡性和查询效率。 

(二)叶子节点存储完整的用户记录

B+树的叶子节点存储的是完整的用户记录,即包括所有列的值(包括隐藏列),在InnoDB中,叶子节点不仅仅是索引,还包含了实际的数据记录。这种特性使得聚簇索引与普通索引有所不同。

数据即索引 

聚簇索引中的叶子节点存储了完整的用户记录,因此聚簇索引就是数据的存储方式。换句话说,索引即数据,数据即索引。

自动创建

在InnoDB存储引擎中,聚簇索引会自动为每个表创建,并且不需要在MySQL语句中显式使用INDEX语句去创建。通常情况下,聚簇索引是基于表的主键创建的。 

(三)聚簇索引的优缺点

聚簇索引的优点聚簇索引的缺点
快速数据访问:由于数据和索引存储在一起,基于主键的查询非常高效,不需要额外的索引查找。插入和删除成本较高:由于需要维护数据的有序性,插入和删除操作可能需要移动大量记录,导致性能开销。
有序数据存储:记录按照主键顺序存储,适合范围查询和顺序扫描,提高查询性能。更新成本较高:如果更新操作导致主键变化,会引发记录的重新定位和页的重新排序,影响性能。

聚簇索引是InnoDB存储引擎中一种关键的索引类型,通过主键排序和存储完整用户记录,提供了高效的数据访问和有序的数据存储。在优化数据库性能时,理解和合理使用聚簇索引可以显著提升查询和数据操作的效率。具体优化可见:MySQL索引性能优化分析。

三、二级索引

聚簇索引只能在搜索条件是主键值时才能发挥作用,因为B+树中的数据都是按照主键进行排序的。那如果我们想以别的列作为搜索条件该咋办呢?难道只能从头到尾沿着链表依次遍历记录么?不,我们可以多建几棵B+树,不同的B+树中的数据采用不同的排序规则。比方说我们用c2列的大小作为数据页、页中记录的排序规则,再建一棵B+树,效果如下图所示:

在InnoDB存储引擎中,除了聚簇索引(Clustered Index),我们还可以使用二级索引(Secondary Index)来提高非主键列上的查询性能。二级索引是一种基于非主键列的B+树结构,用于快速定位数据记录。

(一)二级索引的特点

基于非主键列排序

二级索引的B+树结构基于指定的非主键列进行排序,这包括以下几个方面:

  • 页内记录排序:在每个页内,记录按照指定列(例如c2列)的大小顺序排成一个单向链表。
  • 页之间的排序:存放用户记录的页按照页内记录的指定列顺序排成一个双向链表。这种结构便于快速范围查询和顺序扫描。
  • 目录项页的排序:存放目录项记录的页根据页内目录项记录的指定列顺序排成一个双向链表,不同层次的页同样遵循这种排序规则。

叶子节点存储部分数据

与聚簇索引不同,二级索引的叶子节点存储的是索引列和主键列的值,而不是完整的用户记录。这种设计减少了存储空间的占用,但在查询过程中需要进行回表操作以获取完整的用户记录。

(二)二级索引的工作流程

假设我们创建了一个基于c2列的二级索引,并通过c2列的值查找某些记录,以查找c2列的值为4的记录为例,查找过程如下::

  1. 确定目录项记录页

    从根页面开始,根据c2列的值4定位到目录项记录所在的页,通过页44快速定位到目录项记录所在的页为页42(因为2 < 4 < 9)。

  2. 通过目录项记录页确定用户记录真实所在的页

    在页42中,根据c2列的值确定实际存储用户记录的页。由于c2列没有唯一性约束,值为4的记录可能分布在多个数据页中。最终确定实际存储用户记录的页在页34和页35中(因为2 < 4 ≤ 4)。

  3. 在真实存储用户记录的页中定位到具体的记录

    在页34和页35中定位到具体的记录,但二级索引的叶子节点中仅存储c2列和主键列c1的值。

  4. 回表操作

    根据主键值到聚簇索引中查找完整的用户记录。这个过程称为回表操作,即从二级索引定位到主键,再通过主键在聚簇索引中查找完整记录。

(三)二级索引的优缺点

二级索引的优点二级索引的缺点
提高查询效率:基于非主键列的查询可以利用二级索引快速定位数据,减少全表扫描的开销。回表操作:查询完整记录时需要回表操作,增加了一次I/O开销。
灵活性:可以为多个列创建二级索引,提升多种查询条件下的性能。占用空间:虽然叶子节点不存储完整记录,但仍会占用额外的存储空间。

二级索引通过基于非主键列排序和存储索引列与主键列的值,为非主键列的查询提供了高效的解决方案。然而,由于叶子节点仅存储部分数据,查询完整记录时需要回表操作。因此,合理使用和配置二级索引,对于提升数据库查询性能至关重要。 具体优化可见:MySQL索引性能优化分析。

四、联合索引

在InnoDB存储引擎中,联合索引(Composite Index)是一种基于多个列的索引,用于提高复杂查询的效率。联合索引通过对多个列进行排序,能够更有效地处理包含多个条件的查询。

同时以多个列的大小作为排序规则,也就是同时为多个列建立索引,比方说我们想让B+树按照c2c3列的大小进行排序,这个包含两层含义:

  • 先把各个记录和页按照c2列进行排序。
  • 在记录的c2列相同的情况下,采用c3列进行排序

c2c3列建立的索引的示意图如下:

如图所示,我们需要注意一下几点:

  • 每条目录项记录都由c2c3页号这三个部分组成,各条记录先按照c2列的值进行排序,如果记录的c2列相同,则按照c3列的值进行排序。

  • B+树叶子节点处的用户记录由c2c3和主键c1列组成。

(一)联合索引的特点

多列排序规则

联合索引按照多个列的值进行排序,其排序规则包括以下两个层次:

  • 第一列排序:首先按照第一个指定列(例如c2列)的值进行排序。
  • 第二列排序:在第一列相同的情况下,按照第二个指定列(例如c3列)的值进行排序。

在这个结构中,每个目录项记录由c2、c3和页号组成,叶子节点存储c2、c3和主键c1。

联合索引的组成

  • 目录项记录:每条目录项记录由c2、c3和页号组成,先按照c2列排序,如果c2列相同,则按照c3列排序。
  • 叶子节点记录:叶子节点处的用户记录包含c2、c3和主键c1列。这种结构使得查询包含c2和c3列的条件时更加高效。

(二)联合索引与单列索引的区别

联合索引

  • 建立联合索引会生成一棵B+树,该树按照c2和c3列进行排序。
  • 查询时,如果使用c2和c3作为条件,能够快速定位记录,减少查询时间。

单列索引

  • 为c2和c3分别建立索引会生成两棵独立的B+树,每棵树分别按照c2或c3进行排序。
  • 查询时,如果只使用c2或c3作为条件,可以利用相应的索引。但如果同时使用c2和c3作为条件,可能需要进行多次索引查找和合并操作,增加查询开销。

(三)联合索引的优缺点

联合索引的优点联合索引的缺点
高效的多列查询:联合索引能够显著提高包含多个列条件的查询性能。插入和维护成本较高:由于需要对多个列进行排序和维护,插入和更新操作可能较慢。
减少单列索引的数量:通过一个联合索引代替多个单列索引,可以节省存储空间。部分匹配限制:联合索引在查询中只能高效利用前缀列,如果查询条件不包括索引的最左列,索引的利用率会降低。

(四)联合索引的使用建议

前缀匹配原则

联合索引在查询中按照列的顺序生效,因此查询条件应尽量包括索引的最左列(即前缀列)。例如,创建了(c2, c3)的联合索引后,查询条件包含c2或(c2, c3)时能够有效利用索引。

适用场景

联合索引适用于需要同时基于多个列进行查询的场景。例如,在电商系统中,可以为商品类别和价格区间创建联合索引,以优化相关查询。

联合索引是InnoDB中一种重要的索引类型,通过对多个列进行排序和索引,提高了多列查询的性能。与单列索引相比,联合索引在处理复杂查询时更加高效。然而,合理的索引设计和使用对于优化数据库性能至关重要。理解联合索引的工作原理和最佳实践,可以帮助我们更好地利用MySQL数据库。  具体优化可见:MySQL索引性能优化分析。

五、总结

InnoDB中的索引是提高数据检索效率的关键。本文介绍了三种主要索引类型:

  1. 聚簇索引:基于主键排序存储完整的用户记录,适合快速主键查询和范围查询。
  2. 二级索引:基于非主键列排序,提升非主键查询性能,但需要回表操作。
  3. 联合索引:基于多个列排序,适用于复杂查询,能够显著提升多列条件查询的效率。

通过合理使用和配置这些索引,能有效提升数据库查询和数据操作的性能。理解索引的工作机制和最佳实践,对于优化MySQL数据库性能至关重要。

 参考文献、书籍及链接

  • 《MySQL技术内幕:InnoDB存储引擎》(第2版):MySQL技术内幕 (豆瓣)
  • 《MySQL 是怎样运行的:从根儿上理解 MySQL》
  • 《Inside InnoDB: The InnoDB Storage Engine》:MySQL :: MySQL 8.0 Reference Manual :: 15 The InnoDB Storage Engine
  • 《InnoDB: The Ultimate Guide》:https://www.percona.com/blog/2018/06/05/innodb-the-ultimate-guide/
  • 《InnoDB Storage Engine Internals》:https://mariadb.com/kb/en/innodb-storage-engine-internals/
  • InnoDB的数据页结构
  • InnoDB存储引擎B+树的树高推导_b+树一般多少层-CSDN博客
  • MySQL索引性能优化分析_mysql索引和性能分析(实战)-CSDN博客

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

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

相关文章

[ES3]大侠立志传存档解密修改

找到存档位置&#xff0c;如果是PC端用户&#xff1a;C:\Users\你自己的用户名\AppData\LocalLow\DefaultCompany\Wulin\一串steamID\选择你要改的存档 这里你要改的存档如果是AutoSave就是自动保存&#xff0c;如果是Save加序号就是你手动保存的存档。 手机端用户自行查其他资…

模拟键盘输入卡号RFID读卡器银河麒麟桌面操作系统兼容适配认证测试报告

本测试报告使用读卡器&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.1d292c1b72i5j0&ftt&id702441469725

通过无线路由器连接三菱PLC的设置方法

1.首先设置无线路由器上网方式为DHCP&#xff08;自动获取IP地址&#xff09;。点击保存&#xff0c;然后点击更多功能 2.再点击网络设置-局域网&#xff0c;勾选DHCP服务器&#xff0c;此功能的作用是对局域网内所有设备分配IP地址。 然后保存&#xff1b; 3.再点击系统设置…

【论文笔记】Fine-tuned CLIP Models are Efficient Video Learners

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Fine-tuned CLIP Models a…

前端一键复制解决方案分享

需求背景 用户需要对流水号进行复制使用&#xff0c;前端的展示是通过样式控制&#xff0c;超出省略号表示&#xff0c;鼠标悬浮展示完整流水号。此处的鼠标悬浮展示采用的是:title&#xff0c;这样就无法对文本进行选中。 下面是给出一键复制的不同的解决方案&#xff0c;希望…

Flink本地安装

去官网下载安装包Index of /apache/flink/flink-1.17.2 进行解压 tar -zxvf /opt/install_packages/flink-1.17.2-bin-scala_2.12.tgz 解压完成后进入flink-1.17目录&#xff0c;执行以下命令启动flink服务 ./bin/start-cluster.sh 执行成功 之后尝试打开flink的webuihttp:/…

qtcreator 仿制vscode黑色背景主题monokai

qtcreator 仿制vscode的monokai黑色主题 1.演示 ​​ ​​ 2.主题配置 ​​ ​​ ​​ ​​ ​​ ​​ ​​ 删掉所有的 把我下面的复制进去 <?xml version"1.0" encoding"UTF-8"?> <style-scheme version"1.0" name&qu…

深入解析大模型RAG:检索、增强与生成的全面指南

RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09; 是一种结合了信息检索技术与语言生成模型的人工智能技术。该技术通过从外部知识库中检索相关信息&#xff0c;并将其作为提示&#xff08;Prompt&#xff09;输入给大型语言模型&#xff0…

哈工深、微信:“慢思考”超长文档翻译智能体

如今&#xff0c;大语言模型已经成为机器翻译任务&#xff08;Machine Translation&#xff09;上的新型强大工具。 然而&#xff0c;多数在机器翻译大语言模型&#xff08;MT-LLM&#xff09;上开展的研究工作都是句子层面的&#xff0c;每一句话都被独立进行翻译&#xff0c;…

训练VLM(视觉语言模型)的经验

知乎&#xff1a;lym 链接&#xff1a;https://zhuanlan.zhihu.com/p/890327005 如果可以用prompt解决&#xff0c;尽量用prompt解决&#xff0c;因为训练&#xff08;精调&#xff09;的模型往往通用能力会下降&#xff0c;训练和长期部署成本都比较高&#xff0c;这个成本也包…

vScode---配置Pyqt5环境--记录

前提条件&#xff1a; python运行环境已正常安装 1、安装Pyqt5 第三方库下载地址记录&#xff1a; 清华大学&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple 豆瓣&#xff1a;https://pypi.douban.com/simple 阿里云&#xff1a;https://mirrors.aliyun.com/pypi/simpl…

一文读懂组态图和组态软件,最浅显的解读

一、什么是组态图 组态图是指在工业自动化领域中&#xff0c;用来描述和展示控制系统中各个组件之间关系和工作流程的图形化表示方法。它是一个系统的框架图&#xff0c;通过图形符号和连接线&#xff0c;将各个组件&#xff08;如传感器、执行器、控制器等&#xff09;以及它…

linux ps和kill指令

目录 ps 命令 kill指令&#xff1a; 示例&#xff1a; 补充&#xff1a;管道的概念 管道的概念 管道的用途 示例 在Linux系统中&#xff0c;ps 和 kill 是两个非常常用的命令&#xff0c;用于管理和终止进程。 ps 命令 ps 命令用于显示当前系统中的进程状态。它可以提供…

责任链模式下,解决开闭原则问题实践

前言 在现代软件工程中&#xff0c;设计模式是解决常见问题的有效工具之一。它们吸收了前人的经验&#xff0c;不仅帮助开发者编写更清晰、更可维护的代码&#xff0c;还能促进团队之间的沟通和协作。责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;作为一…

无人机+视频推流直播EasyCVR视频汇聚/EasyDSS平台在森林防护巡检中的解决方案

随着科技的飞速发展&#xff0c;无人机技术在各个领域的应用日益广泛&#xff0c;特别是在森林防护与巡检方面&#xff0c;无人机以其独特的优势&#xff0c;为传统林业管理带来了革命性的变化。本文将探讨无人机在森林防护巡检中的解决方案&#xff0c;分析其工作原理、优势及…

基于SSM+微信小程序的电子点餐管理系统(点餐1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的电子点餐管理系统实现了管理员及用户。管理员实现了首页、个人中心、餐品分类管理、特色餐品管理、订单信息管理、用户管理、特价餐品管理、活动订单管理、系统管理。…

【论文学习与撰写】使用endnote工具进行论文参考文献的引用与插入

目录 1、软件的安装 2、放入endnote格式文献 3、endnote里文献管理 4、论文里引用参考文献的插入 5、参考文献的格式转换&#xff0c;及格式的下载 1、软件的安装 关注软件管家&#xff0c;进行下载软件和安装软件 下载通道②百度网盘丨下载链接&#xff1a; https://pa…

js.矩阵置零

链接&#xff1a;73. 矩阵置零 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],…

Flutter 11 Android原生项目集成Flutter Module

本文主要讲解如何在已有的Android原生老项目中集成Flutter模块。 实现流程&#xff1a; 1、在Android原生项目根目录下&#xff0c;创建Flutter Module&#xff1b; 2、修改Android原生项目settings.gradle&#xff0c;绑定 Flutter Module&#xff1b; 3、修改Android原生…

15分钟学Go 第6天:变量与常量

第6天&#xff1a;变量与常量 在Go语言中&#xff0c;变量和常量是编程的基础概念。理解如何定义和使用它们不仅能帮助我们管理数据&#xff0c;还能增强代码的可读性和可维护性。在本章中&#xff0c;我们将详细探讨Go语言中的变量和常量&#xff0c;涵盖它们的定义、使用、作…