MySQL为什么用B+树做索引

B+树的⾮叶⼦节点不存放实际的记录数据,仅存放索引,所以数据量相同的情况下,相⽐存储即存索引⼜存记录的 B 树,B+树的⾮叶⼦节点可以存放更多的索引,因此 B+ 树可以⽐ B 树更「矮胖」,查询底层节点的磁盘 I/O次数会更少。

B+ 树有⼤量的冗余节点(所有⾮叶⼦节点都是冗余索引),这些冗余索引让 B+ 树在插⼊、删除的效率都更⾼,⽐如删除根节点的时候,不会像 B 树那样会发⽣复杂的树的变化;

B+ 树叶⼦节点之间⽤链表连接了起来,有利于范围查询,⽽ B 树要实现范围查询,因此只能通过树的遍历来完成范围查询,这会涉及多个节点的磁盘 I/O 操作,范围查询效率不如 B+ 树。

### 三级标题:MySQL 使用 B+ 作为索引的原因 MySQL 的存储引擎选择 B+ 作为索引结构,是基于其在数据库系统中的高效性、稳定性和适配性。B+ 通过其独特的节点结构和多路平衡特性,能够有效减少磁盘 I/O 次,提升查询效率,同时支持范围查询和排序操作,这使其成为数据库索引设计的理想选择[^1]。 B+ 的高扇出特性显著减少了的高度,从而降低了磁盘访问的次。在数据库系统中,据通常存储在磁盘上,而磁盘 I/O 是影响性能的关键因素之一。B+ 通过每个节点存储大量的子节点指针,使得的高度保持在一个较低的水平,从而在查找过程中减少 I/O 操作次,提高整体查询效率[^1]。 此外,B+ 的叶子节点之间通过指针连接形成有序链表,这种结构极大地优化了范围查询的性能。当需要检索某一区间范围内的据时,B+ 可以通过叶子节点之间的链接顺序读取据,而无需反复回溯到上层节点[^1]。 在并发控制方面,B+ 的设计也表现出了良好的适应性。由于其结构的稳定性,B+ 在插入和删除操作时能够保持的平衡,避免了频繁的结构调整,从而减少了锁竞争和资源争用的可能性,提升了数据库在高并发环境下的性能[^2]。 B+ 还能够很好地适配磁盘存储的特性。数据库索引通常存储在磁盘上,且据量大时无法一次性加载到内存中。B+ 的多路存储特性允许每次加载一个节点到内存中进行处理,逐步向下查找,这种方式非常适合磁盘的块存储特性,提高了据检索的效率[^5]。 与哈希索引相比,B+ 在支持范围查询、排序以及部分索引查询方面具有明显优势。哈希索引只能支持等值匹配,无法支持范围查询和排序操作。同时,对于组合索引,哈希索引无法支持部分字段的查询,而 B+ 则可以通过索引前缀的方式支持多字段组合索引的部分查询需求[^4]。 综上所述,B+ 作为一种高效的据结构,不仅在查询效率、范围查询支持、磁盘 I/O 优化等方面表现出色,而且在并发控制和适配数据库工作负载方面也具有显著优势,这使得 MySQL 的存储引擎选择了 B+ 作为其索引实现的核心结构[^1]。 ```python # 示例代码:B+的结构简化表示 class BPlusTreeNode: def __init__(self, is_leaf=False): self.keys = [] # 存储键值 self.children = [] # 存储子节点 self.is_leaf = is_leaf # 是否为叶子节点 self.next = None # 叶子节点的指针,用于范围查询 # 创建一个简单的B+节点 root = BPlusTreeNode() leaf1 = BPlusTreeNode(is_leaf=True) leaf2 = BPlusTreeNode(is_leaf=True) # 构建一个简单的B+结构 root.keys = [10, 20] root.children = [leaf1, leaf2] # 叶子节点存储实际的据指针 leaf1.keys = [5, 7, 10] leaf1.children = ["data5", "data7", "data10"] leaf2.keys = [15, 18, 20] leaf2.children = ["data15", "data18", "data20"] # 链接叶子节点 leaf1.next = leaf2 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值