MySQL 中的 B+ 树实现主要分为两部分:节点页和数据页。
节点页:
B+ 树节点页是指存储索引节点的物理页,每一页大小通常设置为 16 KB。一个节点页通常包括一个页头和一组索引项(或子节点指针)。
- 页头:记录该页所属表的表空间 ID、页类型、页文件名等信息。
- 索引项:记录数据页中键值的最大值及其对应的数据页指针。
B+ 树节点页的结构如下(以 InnoDB 引擎为例):
|--------------------------------------------------------|
| FIL Header |
|--------------------------------------------------------|
| Node Header |
|--------------------------------------------------------|
| Infimum Record |
|--------------------------------------------------------|
| Index Records |
|--------------------------------------------------------|
| Supremum Record |
|--------------------------------------------------------|
| Free Space Info |
|--------------------------------------------------------|
| File Trailer |
|--------------------------------------------------------|
其中,Infimum Record 和 Supremum Record 是为了实现闭区间查询而增加的虚拟记录,不存储实际数据,只有索引键值。
InnoDB 的 B+ 树实现采用了自适应哈希索引算法,即在节点页上设置一个 Hash 表,用于提高查找效率。
数据页:
数据页是指存储表中数据的物理页,同样大小为 16 KB,每个数据页通常包括一个页头和一组记录。记录通常按照主键排序,并且每条记录都包括主键和数据列的值。
数据页的结构如下(以 InnoDB 引擎为例):
|--------------------------------------------------------|
| FIL Header |
|--------------------------------------------------------|
| Page Header |
|--------------------------------------------------------|
| User Records |
|--------------------------------------------------------|
| Free Space Info |
|--------------------------------------------------------|
| File Trailer |
|--------------------------------------------------------|
其中,Page Header 记录了该页的一些元数据信息,例如页类型、页大小、记录数等。
在 B+ 树索引中,每一个节点都可以是存储数据的叶子节点,因此在查询时只需要从根节点开始逐级查找即可。而由于 B+ 树的多路平衡性质,在插入和删除操作时也不会导致树的不平衡。因此,B+ 树被广泛应用于数据库领域,成为实现高效索引的重要工具之一。