| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- package btree
- // ======================== B+ 树分裂策略参数 ========================
- //
- // 分裂点过去写死为 "total/2" (对半分)。这里把它抽成可配参数, 并且主键树与
- // 二级树**各自独立** —— 两个参数分别声明在对应的索引处理器文件里, 不随索引
- // 元数据 (IndexMeta) 传递:
- //
- // 主键 B+ 树 -> DB/core/index/primary_handler.go (btree.PKSplitCfg)
- // 二级 B+ 树 -> DB/core/index/btree_handler.go (btree.SBTSplitCfg)
- // SplitConfig 描述一棵 B+ 树的分裂策略。
- type SplitConfig struct {
- // SplitPercent 分裂时左节点保留的条目百分比 (1~99); <=0 或 >=100 时按 50 处理。
- SplitPercent int
- // SequentialRight 顺序(右端)追加时, 是否让右节点只保留 1 条。
- // 自增/递增键总是插到最右端, 若仍对半分, 每次分裂都要白搬半页 (写放大);
- // 置 true 后左节点几乎保留满页, 只有 1 条落到新右节点。
- SequentialRight bool
- }
- var (
- // PKSplitCfg 主键 B+ 树分裂策略 (由 primary_handler.go 声明)
- PKSplitCfg = SplitConfig{SplitPercent: 50, SequentialRight: true}
- // SBTSplitCfg 二级 B+ 树分裂策略 (由 btree_handler.go 声明)
- SBTSplitCfg = SplitConfig{SplitPercent: 50, SequentialRight: false}
- )
- // splitPoint 计算分裂分界下标 mid: 左节点保留 [0,mid), 右节点保留 [mid,total)。
- // insertedAtRight 表示本次插入落在节点最右端。
- func splitPoint(total int, cfg SplitConfig, insertedAtRight bool) int {
- if total <= 1 {
- return 1
- }
- if cfg.SequentialRight && insertedAtRight {
- return total - 1
- }
- p := cfg.SplitPercent
- if p <= 0 || p >= 100 {
- p = 50
- }
- mid := total * p / 100
- if mid < 1 {
- mid = 1
- }
- if mid > total-1 {
- mid = total - 1
- }
- return mid
- }
|