16KB的小世界:InnoDB数据页背后的高效秘密

82 阅读5分钟

InnoDB 的数据页与 B+ 树的关系

InnoDB的数据页是InnoDB存储引擎中用于存储数据的基本单位。是磁盘上的一个连续区域,通常大小为16KB。

在 MySQL 的 InnoDB 存储引擎中,数据页B+树是数据存储和检索的核心概念。可以将它们的关系简单比喻成“仓库里的货架和货物”:

  • 数据页: 数据存储的基本单元,类似仓库中存放货物的“货架”。每一页固定为 16KB(默认大小),用来存放表的实际数据(如行记录)。
  • B+树: 数据存储的索引结构,类似仓库中的“地图或索引牌”,帮助我们快速定位货架(即数据页)的位置,从而快速找到具体的货物(即数据)。

B+树中的每个节点,实际上会存储指向数据页的指针。当我们查询数据时,B+树从根节点开始,通过多层索引定位到某个叶子节点,叶子节点会直接指向数据页,从而找到我们想要的数据。


数据页的构成:像一本小书,分为几个部分

数据页(一个 16KB 的存储单元)可以分为多个部分,类似一本小书,分为目录、内容、附加信息等。它具体包括以下几个部分:

  1. 文件头部(File Header):
    页的基本信息,例如数据页的类型(是否是索引页、数据页等)、页号、校验值,用于页的基本管理。

  2. 页目录(Page Directory):
    类似书的目录,用来快速定位数据记录的位置,加快数据检索速度。

  3. 行记录存储区(User Records):
    数据页的核心部分,用来存储真正的行数据(表中的一条条记录)。

  4. 页尾部(File Trailer):
    用来校验页的数据完整性,防止数据损坏。

  5. 插入缓冲区(Free Space):
    用来存放尚未使用的空间,方便后续插入新记录。

以下是关于 InnoDB 数据页构成的内容,以 Excel 表格的格式列出:

部分名称描述作用
文件头部(File Header)存储页的元信息,包括页类型、页号、校验值等。用于管理页的基本信息和验证页的完整性。
页目录(Page Directory)用于快速定位数据行位置的目录结构。加速数据检索,类似于书的目录。
行记录存储区(User Records)实际存放表中行记录的地方,包括表中的数据。存储真正的用户数据(表的行记录)。
页尾部(File Trailer)用于保存校验值,检测页是否在存储或传输过程中被修改或损坏。确保数据页的完整性和一致性。
插入缓冲区(Free Space)存储尚未使用的空间,用于插入新记录时分配存储的临时区域。减少插入数据时对页结构的影响,增强插入效率。

为何数据页能高效存储和检索?

数据页的高效性体现在以下几个方面:

  1. 固定大小(16KB):
    每个数据页大小固定(默认为 16KB),便于管理和优化磁盘读取效率。一次读取一个数据页时,可以通过“预读”批量加载页中的多个记录,减少磁盘 I/O 操作。

  2. 行数据的紧凑存储:
    数据页通过紧凑格式存储行记录,减少了数据冗余,节省空间。例如,字符串可以存储为变长,整数可以存储为最小必要字节长度。

  3. B+树索引的支持:
    B+树的叶子节点直接指向数据页,借助索引快速定位到目标页,从而快速检索数据,大幅提升查询性能。

  4. 页目录的优化:
    数据页内部有“页目录”来组织数据记录的位置,通过二分法快速定位小范围数据,进一步加速检索速度。

  5. 分裂与合并:
    数据页在插入或删除数据时,支持自动的页分裂(拆分页存储更多数据)或合并(减少空闲页),以保持数据存储的紧凑性和高效性。


InnoDB 中数据页和 B+树的关系流程图

以下是数据页与 B+树的关系,以及查询过程的简单流程图:

           查询过程(从根节点到数据页)

       ┌──────────────┐
       │              │
       │   B+树索引    │
       │  (根节点)   │
       │              │
       └─────┬────────┘
             │
             ▼
 ┌────────────────────┐
 │    B+树非叶子节点   │
 │ (存储子节点指针)  │
 └─────┬──────────────┘
       │
       ▼
 ┌────────────────────┐
 │     B+树叶子节点    │
 │(指向数据页的指针) │
 └─────┬──────────────┘
       │
       ▼
 ┌────────────────────┐
 │      数据页         │
 │ (存储行记录数据)  │
 └────────────────────┘

查询数据的详细流程解释

  1. 根节点定位:
    查询从 B+树的根节点开始,根据查询条件(如主键或索引值),判断数据在哪个子节点中。

  2. 下层节点查找:
    根据根节点存储的范围,找到对应的非叶子节点,继续向下层搜索。

  3. 找到叶子节点:
    最终通过多层索引找到 B+树的叶子节点。叶子节点中存储了数据页的指针。

  4. 访问数据页:
    根据指针,直接读取目标数据页,从页中找到具体的行数据。

44.png


总结与类比

  • B+树 = 图书馆的索引系统: 它告诉我们书在哪个货架上。
  • 数据页 = 图书馆的货架: 存储着具体的书籍(行记录)。
  • 高效性来源:
    • 数据页的固定大小和紧凑存储,让每次 I/O 操作效率更高;
    • 页目录和 B+树的结合,加快了检索速度;
    • 分裂与合并机制,避免了存储碎片。