当前位置: 首页 > news >正文

从数据页角度理解B+树查询

1. 从数据页角度理解B+树查询

1.1. 数据库中的存储结构

1. 存储基本单位:页(Page)

  • 数据库以“页”为单位进行 I/O 操作,不是以“行”为单位。
  • 页大小:

MySQL InnoDB 默认:16KB

SQL Server:8KB

Oracle(称为 Block):支持 2KB 到 64KB

2. 存储结构层级关系

数据库由一个或多个表空间组成,表空间从管理上可以划分为系统表空间、用户表空间、撤销表空间、临时表空间等。

  • 表空间(Tablespace):逻辑容器,存储段对象
  • (Segment):由一个或多个区组成,创建表或索引时生成
  • (Extent):由连续的页组成,InnoDB 中为 64 个页,即 1MB
  • (Page):最小的 I/O 单位,可存储多行记录(Row)

3. 表空间类型

  • 共享表空间:多张表共用一个表空间(共享.ibd 文件)
  • 独立表空间(推荐):每张表独立保存为一个 .ibd 文件

1.2. 数据页内的结构

数据页分成 3 个部分:

1. 首先是文件通用部分,也就是文件头和文件尾。

类似集装箱,将页的内容进行封装,通过文件头和文件尾校验的方式来确保页的传输是完整的。

在文件头中有两个字段,分别是 FIL_PAGE_PREV 和 FIL_PAGE_NEXT,它们的作用相当于指针,分别指向上一个数据页和下一个数据页。连接起来的页相当于一个双向的链表,如下图所示:

采用链表的结构让数据页之间不需要是物理上的连续,而是逻辑上的连续。

文件尾的校验方式就是采用 Hash 算法进行校验。

2. 第二个部分是记录部分

页的主要作用是存储记录,所以“最小和最大记录”和“用户记录”部分占了页结构的主要空间。另外空闲空间是个灵活的部分,当有新的记录插入时,会从空闲空间中进行分配用于存储新记录。

3. 第三部分是索引部分

部分重点指的是页目录,它起到了记录的索引作用,因为在页中,记录是以单向链表的形式进行存储的。单向链表的特点就是插入、删除非常方便,但是检索效率不高,最差的情况下需要遍历链表上的所有节点才能完成检索,因此在页目录中提供了二分查找的方式,用来提高记录的检索效率。这个过程就好比是给记录创建了一个目录:

  • 将所有的记录分成几个组,这些记录包括最小记录和最大记录,但不包括标记为“已删除”的记录。
  • 第 1 组,也就是最小记录所在的分组只有 1 个记录;最后一组,就是最大记录所在的分组,会有 1-8 条记录;其余的组记录数量在 4-8 条之间。这样做的好处是,除了第 1 组(最小记录所在组)以外,其余组的记录数会尽量平分。
  • 在每个组中最后一条记录的头信息中会存储该组一共有多少条记录,作为 n_owned 字段。
  • 页目录用来存储每组最后一条记录的地址偏移量,这些地址偏移量会按照先后顺序存储起来,每组的地址偏移量也被称之为槽(slot),每个槽相当于指针指向了不同组的最后一个记录。如下图所示:

页目录存储的是槽,槽相当于分组记录的索引。我们通过槽查找记录,实际上就是在做二分查找。这里我以上面的图示进行举例,5 个槽的编号分别为 0,1,2,3,4,我想查找主键为 9 的用户记录,我们初始化查找的槽的下限编号,设置为 low=0,然后设置查找的槽的上限编号 high=4,然后采用二分查找法进行查找。

首先找到槽的中间位置 p=(low+high)/2=(0+4)/2=2,这时我们取编号为 2 的槽对应的分组记录中最大的记录,取出关键字为 8。因为 9 大于 8,所以应该会在槽编号为 (p,high] 的范围进行查找

接着重新计算中间位置 p’=(p+high)/2=(2+4)/2=3,我们查找编号为 3 的槽对应的分组记录中最大的记录,取出关键字为 12。因为 9 小于 12,所以应该在槽 3 中进行查找。

遍历槽 3 中的所有记录,找到关键字为 9 的记录,取出该条记录的信息即为我们想要查找的内容。

1.3. 从数据页角度看B+树索引原理

MySQL 的 InnoDB 存储引擎采用 B+ 树作为索引,而索引又可以分成聚集索引和非聚集索引(二级索引),这些索引都相当于一棵 B+ 树,如图所示。

一棵 B+ 树按照节点类型可以分成两部分:

节点类型

存储内容

非叶子节点

存储索引键 + 指向下层页的指针

叶子节点

存储实际的行记录(主键聚集索引)或主键指针(二级索引)

B+树查找过程:

通过 B+ 树的索引查询行记录,首先是从 B+ 树的根开始,逐层检索,直到找到叶子节点,也就是找到对应的数据页为止,将数据页加载到内存中,页目录中的槽(slot)采用二分查找的方式先找到一个粗略的记录分组,然后再在分组中通过链表遍历的方式查找记录。

普通索引和唯一索引在查询效率上的不同:

唯一索引就是在普通索引上增加了约束性,也就是关键字唯一,找到了关键字就停止检索。而普通索引,可能会存在用户记录中的关键字相同的情况,根据页结构的原理,当我们读取一条记录的时候,不是单独将这条记录从磁盘中读出去,而是将这个记录所在的页加载到内存中进行读取。InnoDB 存储引擎的页大小为 16KB,在一个页中可能存储着上千个记录,因此在普通索引的字段上进行查找也就是在内存中多几次“判断下一条记录”的操作,对于 CPU 来说,这些操作所消耗的时间是可以忽略不计的。所以对一个索引字段进行检索,采用普通索引还是唯一索引在检索效率上基本上没有差别。


文章转载自:

http://2KxkprRe.mxnhq.cn
http://cINjhi3c.mxnhq.cn
http://uhLF5PgJ.mxnhq.cn
http://XZz6XTSU.mxnhq.cn
http://iSGcGScM.mxnhq.cn
http://y0RBLD5a.mxnhq.cn
http://PopxjtlE.mxnhq.cn
http://9Y1SVBZe.mxnhq.cn
http://Dq8o9iqE.mxnhq.cn
http://zMkM9rvO.mxnhq.cn
http://BjQyGXla.mxnhq.cn
http://tDaRSYwW.mxnhq.cn
http://mBgKVHEb.mxnhq.cn
http://aoJd4Tvn.mxnhq.cn
http://PJg5Tkam.mxnhq.cn
http://cBXenE9T.mxnhq.cn
http://1i6eGWEz.mxnhq.cn
http://Mn45axSK.mxnhq.cn
http://e2RWoNKF.mxnhq.cn
http://LKPjxiXD.mxnhq.cn
http://GMbuUWh8.mxnhq.cn
http://fBOCt0d5.mxnhq.cn
http://6B9Yl6Uy.mxnhq.cn
http://MMZpaieP.mxnhq.cn
http://Zr4fMLgi.mxnhq.cn
http://qBqr0t1X.mxnhq.cn
http://L3j1kB1A.mxnhq.cn
http://KOZO8XWq.mxnhq.cn
http://1cR04eZp.mxnhq.cn
http://Oc4exT9x.mxnhq.cn
http://www.dtcms.com/a/214396.html

相关文章:

  • 虚拟机配置桥接,远程工具直接访问
  • Vue3解决路由缓存问题
  • 基于matlab版本的三维直流电法反演算法
  • 二叉树part01(二)
  • DNS解析流程入门篇
  • java基础(面向对象进阶高级)泛型(API一)
  • 编程日志5.20
  • 深入剖析Java中的伪共享:原理、检测与解决方案
  • uniapp 搭配uviwe u-picker 实现地区联栋
  • OSPF补充信息
  • MathQ-Verify:数学问题验证的五步流水线,为大模型推理筑牢数据基石
  • Neural Blind Deconvolution Using Deep Priors论文阅读
  • Leetcode 3556. Sum of Largest Prime Substrings
  • 《1.1_4计算机网络的分类|精讲篇|附X-mind思维导图》
  • 如何设计ES的冷热数据分离架构?Elasticsearch 集群如何实现高可用?如何避免脑裂问题?如果出现脑裂如何恢复?
  • API Gateway CLI 实操入门笔记(基于 LocalStack)
  • 基于 docker 部署 k8s 集群
  • 集星云推短视频矩阵系统的定制化与私有化部署方案
  • redis在Spring中的一些使用
  • 机器学习中的线性回归:从理论到实践的深度解析
  • 企业数据安全全生命周期守护方案:从组织到技术的三维实践
  • PyTorch实战——生成对抗网络数值数据生成
  • (自用)Java学习-5.14(注册,盐值加密,模糊查询)
  • 树莓派超全系列教程文档--(48)树莓派内核头文件
  • Vue列表渲染
  • OpenCV CUDA模块图像过滤------创建一个行方向的一维积分(Sum)滤波器函数createRowSumFilter()
  • Java进阶并发编程(中篇)
  • 华为仓颉语言初识:结构体struct和类class的异同
  • Unity 3D AssetBundle加密解密教程
  • ⭐️⭐️⭐️ 模拟题及答案 ⭐️⭐️⭐️ 大模型Clouder认证:RAG应用构建及优化