B+Tree从原理到实战:手推插入分裂与删除,彻底搞懂数据库索引底层

B+Tree数据库索引数据结构
于 2026-10-01 07:43:05 修改
·本内容遵循CC 4.0 BY-SA版权协议

每个认真学过数据结构的人,迟早都会在数据库索引、文件系统目录组织里撞上B+Tree这个名字。它不像哈希表那样一两句话就能讲完,也不像红黑树那样在教科书里风光无限,但MySQL InnoDB的聚簇索引、PostgreSQL的默认表索引、许多文件系统的元数据组织,底层核心都是它。这篇文章从“为什么需要B+Tree”开始,讲到节点结构和约束规则,再带你把一棵五阶B+Tree的插入、分裂、删除全流程用手算推演一遍,最后整理面试和考研里的高频考点与易错点。适合正在复习数据结构期末、准备考研复试的同学,也适合写了几年SQL但始终没搞懂索引底层是怎么回事的工程师——写过SQL不一定真懂索引,而索引的第一课绕不开B+Tree。

1. 为什么需要B+Tree:先想明白它解决了什么问题

1.1 哈希表、二叉搜索树、红黑树各自的短板

很多人初学数据结构时有个疑问:查找一个数据,哈希表不是O(1)吗?为什么数据库不用哈希表当默认索引?

哈希表的O(1)只针对单点精确查询。一旦你要查范围,比如“id大于1000且小于2000的所有记录”,哈希表的桶是按哈希值分散的,物理上没有顺序,只能全表扫描或采用其他维护有序结构的方式。对于OLTP场景,点查是主力,但OLAP和报表场景里范围查询一点都不少,一个不支持范围查询的索引结构肯定撑不了全场。

二叉搜索树倒是能维护顺序,但它的高度很容易失控。连续插入有序数据时,普通二叉搜索树会退化成一条链表,查询从O(log n)变成O(n)。针对退化问题,AVL树和红黑树通过旋转保证高度为O(log n)。红黑树在内存中非常优秀,比如C++的std::map、Java的TreeMap都用它。可问题在于:一个节点只存一个键,如果数据量是一亿行,树高度约为26层左右。在一亿行的表里做一次查询,意味着要经过二十多次节点跳转。

在内存里,二十多次比较是纳秒级的事,无所谓。但数据库的数据大部分在磁盘上,一次随机磁盘IO的成本是几毫秒。二十多次IO在纯机械硬盘时代就是几百毫秒,哪怕换到SSD,也是不可接受的延迟。所以问题的核心不是“比较次数”,而是“要访问多少个节点”。一个节点在数据库里对应一页数据,访问一个节点往往就是一次磁盘读。为了让树变得更矮,必须让每个节点保存更多的键、拥有更多的子节点,这就是B系列树最基本的设计动机。

1.2 B树已经很好,为什么还要改造成B+Tree

B树(Balance Tree)的核心思想是放弃二叉树限制,让每个节点存储多个键和多个子指针,整棵树保持严格平衡。一个m阶B树的节点最多有m个子树、m-1个键,所有叶子在同一层。因为每个节点能存几百个键,一棵三四层的B树就能支撑上亿条记录的索引。

B树本身已经很好用,但B+Tree在B树基础上做了两个关键改动,这两个改动直接决定了数据库会选它。

第一个改动:B树的所有节点都存数据,而B+Tree只有叶子节点存数据或指向数据的指针,内部节点只存“路由键”。这个改动带来的直接好处是内部节点变小了。同样一个16KB的页,如果存B树那种带完整记录的节点,放不了几百条记录;但只存键和子页号,放下上千个键毫无压力。内部节点能容纳的子树数量越大,树的扇出就越高,树就越矮,查询需要的磁盘IO就越少。

第二个改动:B+Tree的叶子节点通过指针串成一个有序链表。查找单点时B树的路径可能结束在第2层,B+Tree则必须一路走到叶子节点。看起来B+Tree更费,但正因为所有查询都走同样的路径,查询性能非常稳定,没有“某些数据运气好更快”的波动。做范围查询时,B+Tree找到第一个符合条件的叶子后,顺着链表往后扫就行,不需要频繁回溯父节点再去另一棵子树里找下一个节点。B树做范围查询必须做中序遍历,中间伴随大量回溯,效率低得多。

这两个改动放在一起,B+Tree就成了磁盘场景下的最优解之一。内部节点小而多子、叶子链表利于顺序扫描,这两个特征恰好对应数据库最典型的两种访问模式:随机点查和顺序范围扫。

2. B+Tree的节点结构与约束规则:一页能装多少关键看这里

2.1 一个节点到底长什么样

理解B+Tree最直观的方式是看节点定义。一个节点可以简单理解成三个部分:一组有序键、一组子指针、一个是否是叶子的标记。叶子节点额外多了前后兄弟指针,用于串成链表。

用近似伪代码表示节点结构就是:

PYTHON
class BPlusTreeNode:
keys: list # 有序键数组,长度为 k
children: list # 子节点指针数组,长度为 k+1(内部节点使用)
parent: BPlusTreeNode
is_leaf: bool
最低 0.47元/天 开通会员,解锁全文
left
成为会员后, 你将解锁
right
benefits 下载资源随意下
benefits 优质VIP博文免费学
benefits 优质文库回答免费看
benefits 付费资源9折优惠
红黑树从原理到C++实现:旋转、变色与插入删除修复全解析
数据结构中的二叉查找树是高效检索的基石,但极端情况下会退化成链表。红黑树通过颜色约束与旋转变色维持平衡,保证最坏情况下的对数级查找性能。相较于AVL树的严格平衡和跳表的概率性结构,红黑树在写操作与读操作之间取得良好平衡,被广泛用于标准库有序容器、内核定时器、Java TreeMap等场景。理解红黑树的关键在于把握五大性质如何推出树高上界,以及插入删除修复中旋转与变色的本质。文章从这些基础原理出发,结合完整C++实现,演示如何用随机测试验证树的正确性,为工程实践提供可复用的参考。
B+树生成以及节点插入、删除与查询
- B+树类是核心,它构建了树的结构,并提供了插入、删除、查找等操作的实现。8. **B+树应用** - 数据库索引:MySQL的InnoDB存储引擎使用B+树作为索引结构。
听海者
1293
B树和B+树的插入、删除图文详解 - nullzx - 博客园1
在B+树中,删除过程与B树类似,但仍然需要注意数据仅存在于叶子节点,而索引节点仅包含指向叶子节点的指针。### 结构设计的影响B树和B+树的结构设计对它们在实际使用中的表现有着深远的影响。
胡说先森
1423
数据库中B+树索引的原理
以下为B+树索引的基本流程:1. **索引构建**:当向数据库中插入一条记录时,对应的键值会被插入到B+树的适当位置。如果树已满,则会分裂节点以保持平衡。2.
1227
完整的C/C++时序的B+树(数据库系统实现实验,用于做数据索引)
B+树,全称为B-Plus Tree,是一种自平衡的多路查找树,广泛应用于数据库和文件系统的数据索引中。
一旦
1336
mysql聚簇索引的页分裂原理实例分析
理解聚簇索引的页分裂原理对于数据库性能调优至关重要,尤其是在处理大数据量和高并发的场景下。通过合理设计主键和优化插入策略,可以有效地减少页分裂,提高InnoDB表的读写效率。
weixin_38643212
1421
B+索引,插入,删除,修改
在数据库管理系统中,索引是一种高效检索数据的数据结构。B+树(B+ Tree)是数据库中最常用的索引类型之一,尤其适用于大型数据库系统。
27
MySQL索引背后的数据结构及算法原理
这样的设计使得B+Tree在查找、插入和删除操作上具有较高的性能,尤其是在处理大量数据时更为明显。
2050
MySQL Innodb 索引原理详解
##### 2.4 插入与删除- **插入操作**:当向B+树中插入新的关键字时,如果当前节点已满,则需要进行分裂操作。B+树的分裂操作只会改变当前节点及其父节点的状态,不会影响其他兄弟节点。
1273
索引基础——B-Tree、B+Tree、红黑树、BTree数据结构1
例如,B-Tree适合对数据进行随机访问,B+Tree适合全序扫描,红黑树则在动态调整和插入删除上有优势。理解并熟练掌握这些数据结构的原理和特性,对于优化数据库和文件系统的性能至关重要。
大头蚊香蛙
302
B-tree和B+tree的定义、查找、插入、删除
B+树的查找、插入和删除操作与B-树类似,但由于数据只在叶节点,所以所有查询最终都会到达叶节点,这使得B+树更适合数据库索引,特别是范围查询。
shandongwill
39