【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. 在对应的组中进行遍历,最终获取到数据。
相关推荐
爱上语文15 分钟前
MyBatis实现数据库的CRUD
java·开发语言·数据库·mybatis
明月看潮生27 分钟前
青少年编程与数学 02-007 PostgreSQL数据库应用 06课题、数据库操作
数据库·青少年编程·postgresql·编程与数学
wenchun00130 分钟前
【MySQL实战】mysql_exporter+Prometheus+Grafana
数据库·mysql·性能优化·数据分析
tq108634 分钟前
AIP-121 面向资源设计
数据库
alden_ygq42 分钟前
Go os/exec 使用实践
开发语言·数据库·golang
龙少95431 小时前
【UNION与UNION ALL的区别?】
数据库
菜鸟阿康学习编程1 小时前
JDBC 实战项目(增删改查小系统,接近完美!)017
java·开发语言·数据库
zhangfeng11331 小时前
python mysql库的三个库mysqlclient mysql-connector-python pymysql如何选择,他们之间的区别
数据库·python·mysql
007php0072 小时前
深入了解计算机网络中的路由协议与性能优化
java·开发语言·数据库·后端·python·计算机网络·golang
m0_748244962 小时前
大数据-240 离线数仓 - 广告业务 测试 ADS层数据加载 DataX数据导出到 MySQL
大数据·数据库·mysql