InnoDB 的数据页与 B+ 树的关系
InnoDB的数据页是InnoDB存储引擎中用于存储数据的基本单位。是磁盘上的一个连续区域,通常大小为16KB。
在 MySQL 的 InnoDB 存储引擎中,数据页和B+树是数据存储和检索的核心概念。可以将它们的关系简单比喻成“仓库里的货架和货物”:
- 数据页: 数据存储的基本单元,类似仓库中存放货物的“货架”。每一页固定为 16KB(默认大小),用来存放表的实际数据(如行记录)。
- B+树: 数据存储的索引结构,类似仓库中的“地图或索引牌”,帮助我们快速定位货架(即数据页)的位置,从而快速找到具体的货物(即数据)。
B+树中的每个节点,实际上会存储指向数据页的指针。当我们查询数据时,B+树从根节点开始,通过多层索引定位到某个叶子节点,叶子节点会直接指向数据页,从而找到我们想要的数据。
数据页的构成:像一本小书,分为几个部分
数据页(一个 16KB 的存储单元)可以分为多个部分,类似一本小书,分为目录、内容、附加信息等。它具体包括以下几个部分:
-
文件头部(File Header):
页的基本信息,例如数据页的类型(是否是索引页、数据页等)、页号、校验值,用于页的基本管理。 -
页目录(Page Directory):
类似书的目录,用来快速定位数据记录的位置,加快数据检索速度。 -
行记录存储区(User Records):
数据页的核心部分,用来存储真正的行数据(表中的一条条记录)。 -
页尾部(File Trailer):
用来校验页的数据完整性,防止数据损坏。 -
插入缓冲区(Free Space):
用来存放尚未使用的空间,方便后续插入新记录。
以下是关于 InnoDB 数据页构成的内容,以 Excel 表格的格式列出:
部分名称 | 描述 | 作用 |
---|---|---|
文件头部(File Header) | 存储页的元信息,包括页类型、页号、校验值等。 | 用于管理页的基本信息和验证页的完整性。 |
页目录(Page Directory) | 用于快速定位数据行位置的目录结构。 | 加速数据检索,类似于书的目录。 |
行记录存储区(User Records) | 实际存放表中行记录的地方,包括表中的数据。 | 存储真正的用户数据(表的行记录)。 |
页尾部(File Trailer) | 用于保存校验值,检测页是否在存储或传输过程中被修改或损坏。 | 确保数据页的完整性和一致性。 |
插入缓冲区(Free Space) | 存储尚未使用的空间,用于插入新记录时分配存储的临时区域。 | 减少插入数据时对页结构的影响,增强插入效率。 |
为何数据页能高效存储和检索?
数据页的高效性体现在以下几个方面:
-
固定大小(16KB):
每个数据页大小固定(默认为 16KB),便于管理和优化磁盘读取效率。一次读取一个数据页时,可以通过“预读”批量加载页中的多个记录,减少磁盘 I/O 操作。 -
行数据的紧凑存储:
数据页通过紧凑格式存储行记录,减少了数据冗余,节省空间。例如,字符串可以存储为变长,整数可以存储为最小必要字节长度。 -
B+树索引的支持:
B+树的叶子节点直接指向数据页,借助索引快速定位到目标页,从而快速检索数据,大幅提升查询性能。 -
页目录的优化:
数据页内部有“页目录”来组织数据记录的位置,通过二分法快速定位小范围数据,进一步加速检索速度。 -
分裂与合并:
数据页在插入或删除数据时,支持自动的页分裂(拆分页存储更多数据)或合并(减少空闲页),以保持数据存储的紧凑性和高效性。
InnoDB 中数据页和 B+树的关系流程图
以下是数据页与 B+树的关系,以及查询过程的简单流程图:
查询过程(从根节点到数据页)
┌──────────────┐
│ │
│ B+树索引 │
│ (根节点) │
│ │
└─────┬────────┘
│
▼
┌────────────────────┐
│ B+树非叶子节点 │
│ (存储子节点指针) │
└─────┬──────────────┘
│
▼
┌────────────────────┐
│ B+树叶子节点 │
│(指向数据页的指针) │
└─────┬──────────────┘
│
▼
┌────────────────────┐
│ 数据页 │
│ (存储行记录数据) │
└────────────────────┘
查询数据的详细流程解释
-
根节点定位:
查询从 B+树的根节点开始,根据查询条件(如主键或索引值),判断数据在哪个子节点中。 -
下层节点查找:
根据根节点存储的范围,找到对应的非叶子节点,继续向下层搜索。 -
找到叶子节点:
最终通过多层索引找到 B+树的叶子节点。叶子节点中存储了数据页的指针。 -
访问数据页:
根据指针,直接读取目标数据页,从页中找到具体的行数据。
总结与类比
- B+树 = 图书馆的索引系统: 它告诉我们书在哪个货架上。
- 数据页 = 图书馆的货架: 存储着具体的书籍(行记录)。
- 高效性来源:
- 数据页的固定大小和紧凑存储,让每次 I/O 操作效率更高;
- 页目录和 B+树的结合,加快了检索速度;
- 分裂与合并机制,避免了存储碎片。