【MyDB】5-索引管理之 1-索引管理思路概览
【MyDB】5-索引管理之 1-索引管理思路概览
- 前言
- 总体架构
- 协作流程
- 1. **插入键值(Insert)**
- 2. **范围查询(SearchRange)**
- Node结构
- 节点分裂逻辑
- 参考资料
[!tip]
代码位于top/xianghua/mydb/server/im/中
前言
IM,即 Index Manager,索引管理器,为 MYDB 提供了基于 B+ 树的聚簇索引。
在依赖关系图中可以看到,IM 直接基于 DM,而没有基于 VM。索引的数据被直接插入数据库文件中,而不需要经过版本管理。
本节不赘述 B+ 树算法,更多描述实现。
总体架构
MyDB 的索引通过 B+ 树实现,分为两个核心模块:
BPlusTree.java
负责全局树管理(根节点、并发控制、数据持久化交互)。Node.java
封装单个节点的数据结构与本地操作(插入、分裂、查询)
其职责分别如下
模块 | 职责 | 关键方法 |
---|---|---|
BPlusTree | - 管理根节点UID - 插入/搜索入口 - 递归操作调度 - 根节点分裂处理 | insert() , searchRange() , updateRootUid() , searchLeaf() |
Node | - 节点数据序列化 - 键值操作(插入、分裂) - 范围查询 | insertAndSplit() , leafSearchRange() , split() , searchNext() |
协作流程
1. 插入键值(Insert)
2. 范围查询(SearchRange)
Node结构
// Node 内存布局(字节级操作)
[LeafFlag(1)][KeyNumber(2)][SiblingUid(8)][Son0(8)][Key0(8)]...[SonN(8)][KeyN(8)]
- 直接操作字节数组(通过
SubArray
),避免对象序列化开销。 - 静态方法(如
setRawKthKey
)实现高效字段读写。
节点分裂逻辑
- 触发条件:节点键数达到
2 * BALANCE_NUMBER
(默认 64)。 - 分裂过程:
- 创建新节点,复制原节点后半部分键值。
- 原节点保留前
BALANCE_NUMBER
个键,新节点包含剩余键。 - 更新原节点的
siblingUid
指向新节点。 - 返回新节点的首个键和 UID,供父节点插入。
八、总结
MyDB 的 B+ 树索引通过 分层设计 和 职责分离 实现高效管理:
BPlusTree
是全局指挥官,负责树高变化和跨节点调度。Node
是战术执行者,专注单节点的数据操作与持久化。- 协作关键:通过 UID 引用和递归调用,结合
DataManager
实现磁盘-内存数据桥梁。
参考资料
索引管理 | EasyDB (blockcloth.cn)
MYDB 8. 索引管理 | 信也のブログ (shinya.click)