前言
B树和B+树是多路平衡查找树的核心结构,也是数据库索引、文件系统的底层核心实现。相比于二叉树,多路查找树可以大幅降低树的高度,减少磁盘IO次数,极大提升查询效率。本文结合K阶通用规则和5阶B树实战案例,通俗拆解B树、B+树的节点规则、层数规律、时间复杂度及核心区别。
一、K阶B树 核心定义与规则
B树全称多路平衡查找树,所有叶子节点在同一层,树结构绝对平衡,是高效的磁盘查找结构。我们以通用 K阶B树为标准,总结固定约束规则:
1.1 节点子节点(分叉)数量规则
-
最大分叉数:任意节点最多拥有 K 个子节点
-
最小分叉数(非根节点):最少拥有 ⌈K/2⌉ 个子节点(向上取整)
-
根节点特殊规则:根节点可以最少只有2个子节点(非叶子、非空情况下)
1.2 节点关键字(数据值)数量规则
B树核心公式:子节点数量 = 关键字个数 + 1
由此推导关键字数量约束:
-
单个节点最多关键字:K-1 个
-
非根节点最少关键字:⌈K/2⌉ - 1 个
二、5阶B树 实战案例解析
5阶B树是最常用的面试、考试案例,代入K=5即可套用所有通用规则,快速理解B树底层逻辑。
2.1 5阶B树约束条件
-
最大分叉数:5 个子节点
-
最大关键字数:5-1 =4个(对应你笔记中:5阶B树最多4个值)
-
非根节点最小分叉数:⌈5/2⌉ =3个
-
非根节点最小关键字数:3-1 = 2个
2.2 5阶B树层级节点数量规律
设非根节点最小分叉数为 m=3,B树每层节点数呈等比数列递增,所有叶子节点同层,结构高度规整:
-
第一层(根节点):m⁰ = 1 个节点
-
第二层:m¹ = 3 个节点
-
第三层:m² = 9 个节点
-
第四层:m³ = 27 个节点
-
第h层:m^(h-1) 个节点
2.3 总关键字数与树高公式
每一个节点最少存储 (m-1) 个关键字,整棵树最少总关键字数推导:
总关键字数 X = (m⁰ + m¹ + m² + ... + m^(h-1)) × (m-1)
简化树高计算公式:
h = logₘX
三、B树 时间复杂度推导
B树的查询、插入、删除操作时间复杂度均由树的高度决定,与节点数量无关。
-
最优树高(满树状态):h = logₖn
-
最差树高(临界平衡状态):h = log⌈k/2⌉n
-
统一时间复杂度:O(logn)
核心优势:相比二叉树O(log₂n),K阶B树底数更大,树高急剧降低,磁盘IO次数大幅减少,适配磁盘存储场景。
四、B+树 核心原理(数据库专属优化结构)
B+树是B树的优化变体,是 MySQL数据库索引 的底层实现,完全适配磁盘海量数据存储场景。
4.1 B+树核心特性(与B树最大区别)
-
非叶子节点仅做索引:非叶子节点只存储Key(主键索引值),不存储数据地址和真实数据,仅用于路由查找。
-
数据全在叶子节点:所有真实数据、数据地址,全部存储在最底层叶子节点。
-
叶子节点有序链表串联:所有叶子节点按Key大小有序排列,形成双向有序链表。
-
节点存储容量更大:非叶子节点只存Key,不存数据,相同节点空间可以存储更多索引值,分叉数更多,树的高度更低。
4.2 五阶B+树工作机制
五阶B+树广泛用于数据库索引设计:
-
Key:数据表主键、索引字段值,用于排序和查找匹配;
-
Value:不存数据本身,仅存储数据磁盘地址;
-
多Key存储:单节点可存储大量索引Key,分叉更多,树高极小,查询几乎无IO开销。
4.3 B+树核心优势(数据库选型原因)
-
区间查询极强:叶子节点是有序链表,范围查询、模糊查询无需遍历整树,直接链表遍历即可,效率远高于B树;
-
树高更低:单节点索引密度高,分叉多,海量数据下树高依然可以维持在3-4层;
-
IO效率更高:非叶子节点轻量化,单次磁盘读取可加载更多索引信息,减少磁盘交互次数。
五、B树与B+树 核心总结对比
|
对比维度 |
B树(多路平衡树) |
B+树(数据库索引树) |
|---|---|---|
|
非叶子节点存储内容 |
Key + 数据地址 |
仅Key(纯索引) |
|
真实数据存储位置 |
所有节点(叶子+非叶子) |
仅叶子节点 |
|
叶子节点结构 |
独立无序,无关联 |
有序链表串联 |
|
查询效率 |
单点查询稳定,区间查询弱 |
单点、区间查询均高效 |
|
适用场景 |
文件系统、少量数据查找 |
数据库索引、海量数据检索 |
|
时间复杂度 |
O(logn) |
O(logn) |
六、核心知识点复盘
-
K阶B树:非根节点子节点数 ⌈K/2⌉ ~ K,关键字数 ⌈K/2⌉-1 ~ K-1;
-
5阶B树:单节点最多4个关键字,非根最少2个关键字、3个分叉;
-
B树层数节点等比递增,树高决定查询效率,复杂度O(logn);
-
B+树非叶子节点只做索引,数据全在叶子节点,支持有序区间遍历;
-
数据库优先用B+树的核心原因:树高低、IO少、区间查询性能碾压B树。
&spm=1001.2101.3001.5002&articleId=162913313&d=1&t=3&u=2858003f799e491984d9816a36c9a515)
608

被折叠的 条评论
为什么被折叠?



