西餐厅网站源码,中国房地产100强名单,软文一般发布在哪些平台,微信网站链接怎么做在磁盘存储和内存有序的数据管理中#xff0c;B 树与 B 树是核心的数据结构#xff0c;二者均通过 “多路平衡” 特性减少 IO 次数#xff0c;但在数据存储方式、查询逻辑上存在本质差异。一、B 树#xff08;Balance Tree#xff09;#xff1a;多路平衡搜索树B 树是 “…在磁盘存储和内存有序的数据管理中B 树与 B 树是核心的数据结构二者均通过 “多路平衡” 特性减少 IO 次数但在数据存储方式、查询逻辑上存在本质差异。一、B 树Balance Tree多路平衡搜索树B 树是 “多路平衡搜索树” 的统称核心特点是所有节点均可能存储数据且叶子节点在同一层保证查询效率稳定。1. B 树的核心定义以 m 阶 B 树为例“阶m” 表示节点最多包含的子节点数其结构需满足以下规则每个节点最多存储 m-1 个关键字按升序排列对应 m 个子节点根节点若不是叶子至少有 2 个子节点关键字数 ≥1非根非叶节点至少有 ⌈m/2⌉ 个子节点关键字数 ≥ ⌈m/2⌉ - 1所有叶子节点位于同一层无链表连接。2. B 树结构图示以 3 阶 B 树为例3 阶 B 树的节点最多含 2 个关键字、3 个子节点非根节点至少含 1 个关键字、2 个子节点结构如下[15] —— 根节点1个关键字2个子节点/ \/ \[5, 10] [20, 25] —— 非叶节点2个关键字3个子节点/ | \ / | \/ | \ / | \
[2,3] [7] [12] [18] [22] [28,30] —— 叶子节点存储数据同层↑ ↑ ↑ ↑ ↑ ↑数据 数据 数据 数据 数据 数据 —— 所有节点均含数据查询逻辑如查找 “7”路径为 15 → 5,10 → 7找到数据后直接返回无需到叶子节点特点随机查询可能提前终止但范围查询需回溯父节点如查 “5-20”需分别遍历左、中分支效率低。二、B 树数据库索引首选B 树是 B 树的 “索引 - 数据分离” 变种核心特点是仅叶子节点存储完整数据非叶子节点仅存索引关键字且叶子节点通过链表连接专为磁盘 IO 和范围查询优化。1. B 树的核心定义以 m 阶 B 树为例基于 B 树扩展规则差异如下非叶子节点仅存储 “索引关键字” 和子节点指针不存实际数据叶子节点存储所有关键字及对应数据或数据地址按顺序排列且通过双向链表连接所有查询必须到达叶子节点即使非叶子节点有目标关键字也需到叶子节点获取数据非叶子节点的关键字是叶子节点的 “索引副本”如非叶节点的 “15”在叶子节点中也存在。2. B 树结构图示以 3 阶 B 树为例3 阶 B 树的非叶节点最多含 2 个索引关键字、3 个子节点叶子节点含数据并通过链表连接结构如下[15, 25] —— 根节点仅索引无数据/ | \/ | \[5, 10] [20, 25] [30, 35] —— 非叶节点仅索引无数据/ | \ / | \ / | \/ | \ / | \ / | \
[2,3] [7] [12,15] [18,20] [22] [28,30] [32] [36,38] —— 叶子节点存数据↖ ↗ ↖ ↗ ↖ ↗ ↖ ↗ ↖ ↗————————————————————————————————————双向链表支持范围查询查询逻辑如查找 “7”路径为 15,25 → 5,10 → 7必须到叶子节点范围查询逻辑如查 “5-20”找到起始叶子节点 “5” 后沿双向链表遍历至 “20”无需回溯父节点效率极高。三、B 树与 B 树的构成步骤及图解1. B 树的构成步骤B 树是一种自平衡的多路搜索树构建过程遵循以下步骤步骤 1确定 B 树的阶数阶数 m 表示一个节点最多能包含的子节点数量一个 m 阶 B 树的节点最多包含 m-1 个关键字。以 3 阶 B 树为例每个节点最多 2 个关键字3 个子节点
节点结构[关键字1, 关键字2]/ | \子树1 子树2 子树3
在 B 树和 B 树中关键字Key 是指用于索引和排序的核心数据项类似于字典中的 “单词”通过它可以快速定位到对应的数据。具体来说关键字有两个核心作用排序依据同一节点内的关键字按升序排列形成有序结构索引功能通过关键字可以确定数据的存储位置或子树的范围举例说明假设我们用数字作为关键字构建 B 树存储学生信息关键字是学号关键字就是具体的学号5、10、15节点中的关键字排序后[5, 10, 15]每个关键字对应着具体的学生数据如姓名、成绩等或指向存储这些数据的子树在 B 树中非叶节点的关键字仅作为索引如[5, 10]用于定位子树叶节点的关键字既作为索引又关联着实际数据如[5(张三), 10(李四)]简单理解关键字就像图书馆的书号通过书号关键字可以快速找到对应的书籍数据而不需要逐个翻阅。步骤 2插入关键字并保持排序新关键字插入到合适的叶子节点保持节点内关键字有序
初始插入5[5]插入3小于5放左侧[3, 5]插入7大于5放右侧[3, 5, 7] // 此时节点关键字数超过23阶B树最大2个需要分裂
步骤 3节点分裂保持平衡当节点关键字数超过上限时中间关键字上移节点分裂为两个
分裂[3,5,7][5] // 中间关键字上移为父节点/ \
[3] [7] // 分裂为两个子节点
步骤 4继续插入并调整
插入1、9[5]/ \
[1,3] [7,9]插入6会导致右侧节点分裂[5,7]/ | \[1,3] [6] [9]
2. B 树的构成步骤B 树是 B 树的变种构建过程略有不同步骤 1确定 B 树的阶数与 B 树类似但非叶子节点仅作为索引不存储实际数据。以 3 阶 B 树为例
非叶节点仅索引[关键字1, 关键字2]/ | \子树1 子树2 子树3叶节点存数据[关键字1(数据), 关键字2(数据)]
步骤 2插入关键字到叶节点所有关键字都插入到叶节点保持有序
插入5、3、7
叶节点[3(数据),5(数据),7(数据)] // 超过上限需要分裂
步骤 3叶节点分裂并更新索引叶节点分裂后将分裂点关键字添加到父节点作为索引
分裂后[5] // 父节点仅索引/ \
[3(数据)] [5(数据),7(数据)] // 叶节点↖ ↗————链表
步骤 4继续插入并维护链表叶节点之间通过链表连接方便范围查询
插入1、9、6后[5,7]/ | \
[1,3] [5,6] [7,9]↖ ↗ ↖ ↗——————————————双向链表
3. B 树与 B 树构建对比构建步骤B 树B 树数据存储所有节点都可存储数据仅叶节点存储数据分裂影响可能影响任何层级节点主要影响叶节点索引随之更新链表结构无链表叶节点通过双向链表连接关键字重复每个关键字只出现一次非叶节点的关键字在叶节点中重复出现B 树构建更简单适合随机访问B 树构建时需维护额外的链表结构但更适合范围查询和磁盘存储系统。四、B 树与 B 树的核心区别对比维度B 树B 树数据存储位置所有节点根、非叶、叶子均存数据仅叶子节点存数据非叶节点仅存索引查询路径长度不稳定可能在非叶节点找到数据稳定必须到叶子节点路径长度固定范围查询效率低需回溯父节点多次遍历分支高叶子节点双向链表一次遍历空间利用率低非叶节点存数据单次 IO 加载少高非叶节点仅存索引单次 IO 加载多数据一致性差数据分散存储更新易导致节点分裂好数据集中在叶子更新影响小适用场景内存有序数据、少量数据随机访问磁盘存储数据库索引、文件系统五、B 树与 B 树在 Java、MySQL 中的应用体现1. Java 中的应用B 树变种红黑树为主Java 中无直接的 “标准 B 树” 实现但核心有序集合依赖红黑树B 树的 2 阶变种本质是 “自平衡二叉搜索树”同时磁盘相关模块隐含 B 树思想。Java 组件底层结构应用场景与 B 树 / B 树的关联TreeMap/TreeSet红黑树2 阶 B 树变种- 内存中有序键值对管理保证O(log n)的增删改查效率- 红黑树通过 “平衡” 保证查询稳定类似 B 树的 “多路平衡” 思想但仅 2 路分支适合内存。java.nio文件系统B 树部分实现- 本地文件系统的索引如 EXT4使用 B 树因文件路径查询多为 “随机访问”无需频繁范围查询B 树的提前终止特性更优。2. MySQL 中的应用B 树为绝对核心MySQL 的索引实现与存储引擎强相关InnoDB默认 和 MyISAM 均基于 B 树但数据与索引的关联方式不同且均弃用 B 树因范围查询需求高频。1InnoDB 引擎的 B 树索引InnoDB 的核心特性是 “聚簇索引”即主键索引与数据物理存储绑定结构如下主键索引聚簇索引叶子节点直接存储完整的行数据按主键顺序排列非叶节点存储主键值 子节点指针仅索引示例主键为id顶层非叶节点[10, 20] / | \/ | \中层非叶节点 中层非叶节点 中层非叶节点[5, 8] [12, 15] [25, 30]/ | \ / | \ / | \/ | \ / | \ / | \叶子节点 叶子节点 叶子节点 ... 叶子节点 叶子节点[id5, ...] [id8, ...] [id12, ...] ... [id25, ...] [id30, ...]↗ ↖ ↗ ↖ ↗ ↖ ↗ ↖ ↗ ↖ ————————————————————————————————叶子节点通过双向链表连接非叶节点顶层、中层仅存储主键值如 10、20、5、8 等和子节点指针不存储实际行数据仅用于索引定位叶子节点存储完整的行数据包含所有字段且严格按照主键值升序排列双向链表所有叶子节点通过链表连接支持高效的范围查询如WHERE id BETWEEN 5 AND 20辅助索引非聚簇索引叶子节点存储 “索引列值 主键值”不存完整数据查询逻辑先查辅助索引得到主键再通过主键索引查完整数据称为 “回表”示例索引列为name顶层非叶节点[Li, Zhang] / | \/ | \中层非叶节点 中层非叶节点 中层非叶节点[Chen, Han] [Liu, Wang] [Zhao, Zhou]/ | \ / | \ / | \/ | \ / | \ / | \叶子节点 叶子节点 叶子节点 ... 叶子节点 叶子节点
[nameChen, id3] [nameHan, id7] ... [nameZhao, id22]↗ ↖ ↗ ↖ ↗ ↖ ————————————————————————————————叶子节点通过双向链表连接非叶节点存储索引列值如 Li、Zhang、Chen 等和子节点指针用于索引定位叶子节点存储索引列值主键值如nameChen对应id3不存储完整行数据回表查询通过辅助索引查询时需先找到对应主键值再到聚簇索引中查询完整行数据这就是 回表双向链表同样支持范围查询如WHERE name BETWEEN Chen AND WangInnoDB 通过这种 B 树结构实现了索引的高效查询聚簇索引直接定位完整数据适合按主键查询辅助索引通过 索引列→主键→完整数据 的路径查询适合按非主键字段过滤双向链表让范围查询无需回溯父节点大幅提升效率2MyISAM 引擎的 B 树索引MyISAM 的索引与数据完全分离非聚簇索引结构差异如下叶子节点存储 “索引列值 数据行的物理地址”而非主键查询逻辑通过索引找到物理地址后直接到磁盘对应位置读取数据无需回表缺点数据更新可能导致物理地址变化需同步更新所有索引效率低于 InnoDB。3MySQL 选择 B 树的核心原因磁盘 IO 效率高非叶节点仅存索引单次 IO 可加载更多关键字减少 IO 次数磁盘 IO 是数据库性能瓶颈范围查询友好叶子节点双向链表支持ORDER BY、BETWEEN等操作无需回溯数据集中存储所有数据在叶子节点更新时仅需调整叶子节点一致性更好。六、总结B 树适合内存中少量有序数据的随机访问如 JavaTreeMap的红黑树但范围查询和磁盘 IO 效率低B 树通过 “索引 - 数据分离” 和 “叶子链表” 优化成为数据库索引MySQL InnoDB/MyISAM、文件系统的首选完美适配磁盘 IO 和范围查询需求。