【MySQL索引:B+树与页的深度解析】

文章目录

  • MySQL索引:B+树与页的深度解析
    • [1. 索引使用的数据结构------B+树](#1. 索引使用的数据结构——B+树)
      • [1.1 B+树介绍](#1.1 B+树介绍)
      • [1.2 B+树的特点](#1.2 B+树的特点)
      • [1.3 B+树和B树的对比](#1.3 B+树和B树的对比)
    • [2. MySQL中的页](#2. MySQL中的页)
      • [2.1 页的介绍](#2.1 页的介绍)
      • [2.2 页主体](#2.2 页主体)
      • [2.3 页目录](#2.3 页目录)
      • [2.4 B+树在MySQL索引中的应用](#2.4 B+树在MySQL索引中的应用)

MySQL索引:B+树与页的深度解析

在MySQL数据库中,索引扮演着至关重要的角色,它作为一种数据结构,极大地助力了数据库在查询、存储及更新数据时的高效运作。鉴于在数据库操作里,查询的频率远远高于增删改的频率,索引的核心作用便在于提升数据检索的效率。

1. 索引使用的数据结构------B+树

1.1 B+树介绍

B+树是一种在数据库与文件系统等领域广泛应用的平衡查找树。以下是一个3阶B+树的示例图:

1.2 B+树的特点

结合上述图示,我们能够归纳出B+树具备以下特点:

  1. 数据有序性与操作复杂度:B+树能够维持数据的稳定有序,无论是插入还是修改操作,其时间复杂度均保持一致。
  2. 节点存储特性:非叶子节点仅承担索引功能,并不存储实际数据,而所有的叶子节点则负责保存真实的数据。
  3. 叶子节点链表结构:所有的叶子节点共同构成了一个有序链表,借助这一链表,可以依据排序次序依次遍历全部数据。

1.3 B+树和B树的对比

B树的结构如下图所示:

通过与B树对比,我们可以明晰B+树所具有的独特特点:

  1. 节点值包含关系:在B+树中,非叶子节点的值涵盖于叶子节点之中。
  2. 叶子节点数据连续性:B+树的叶子节点数据呈现连续且相互链接的状态,这一特性使得区间查找与搜索更为便捷。
  3. 性能均衡性:在树高相同的前提下,B+树查找任意元素的时间复杂度恒定,性能表现更为均衡。

2. MySQL中的页

2.1 页的介绍

  1. 数据存储位置:数据库中的数据存储于磁盘之上。
  2. 页内地址连续性:磁盘中每个页内部的地址是连续的。
  3. 页的作用与大小:页是内存与磁盘交互的最小单元,默认大小为16KB。即便某一页没有数据,也会占用16KB的存储空间,并且页与索引的B+树节点相对应。

在MySQL中存在多种类型的页,其中最常用的便是用于存储数据和索引的"数据页"或"索引页"。无论何种类型的页,都具备"页头"与"页尾",页的主体信息则由"数据行"填充。

"数据页"的基本结构如下图所示:

由于页头包含上一页和下一页的页号,借助这两个属性,能够将页与页连接起来,形成一个双向链表。

2.2 页主体

每当创建一个新页时,系统会自动分配两行,一行代表页内最小行,另一行代表页内最大行。这两行并不存储实际信息,而是作为数据行链表的起始与结束标志。

当插入数据时,数据会被插入到最小行与最大行之间,并按照主键从小到大的顺序进行链接。

2.3 页目录

当一个页中存储的数据量过多时,查找数据会变得繁琐。为提升查找效率,InnoDB采用二分查找的方式来解决这一问题。

具体实现方式为创建一个页目录,将页内所有行进行分组,分组规则如下:

  • 头行(最小行)单独作为一组。
  • 其余行按照顺序分组,每组最多8条数据。

页目录中的一个槽对应一个分组,每组的最后一行地址会被记录在槽中。如此一来,在查找某行数据时,可先通过二分查找确定对应的槽,再在槽所对应的组中进行遍历,从而显著提高查询效率。

2.4 B+树在MySQL索引中的应用

在MySQL索引中,B+树的非叶子节点保存索引数据,叶子节点保存真实数据,如下表所示:

以下以查找"主键 = 3"为例,简要阐述其查找过程:

  1. 在索引页1中:由于3 < 7,所以进入索引页2。
  2. 在索引页2中:因为3 <= 3 < 5,进而进入数据页2。
  3. 在数据页中执行二分查找(依据分组的槽),确定对应的槽。
  4. 在对应的组中进行遍历,最终获取到数据。
相关推荐
萱萱19950412 分钟前
Spring Boot实战:MySQL与Redis数据一致性深度解析与代码实战
spring boot·redis·mysql
EQ-雪梨蛋花汤33 分钟前
【工具】在 Visual Studio 中使用 Dotfuscator 对“C# 类库(DLL)或应用程序(EXE)”进行混淆
数据库·ide·visual studio
shaoweijava1 小时前
基于SpringBoot的求职招聘网站系统(源码+数据库)
java·spring boot·mysql·spring
阿ฅ( ̳• ε • ̳)ฅ1 小时前
C#窗体应用程序连接数据库
开发语言·数据库·c#
光军oi3 小时前
Mysql从入门到精通day5————子查询精讲
android·数据库·mysql
qr9j422335 小时前
Django自带的Admin后台中如何获取当前登录用户
数据库·django·sqlite
cherry52305 小时前
【PostgreSQL】【第4章】PostgreSQL的事务
数据库·postgresql
IT成长日记8 小时前
【MySQL基础】聚合函数从基础使用到高级分组过滤
数据库·mysql·聚合函数
Guarding and trust10 小时前
python系统之综合案例:用python打造智能诗词生成助手
服务器·数据库·python