B+Tree实现

B+Tree是一种多叉树数据结构,主要用于数据库索引。

一个B+Tree对应的结点内容如下

ptr0,key0,ptr1,key1,ptr2,vkey2 | keyBuf0,keyBuf1,vkeyBuf2

结点内容安装key来排序,搜索时使用二分查找。

结点数据结构

为了能支持字符串这种变长的key,我们在key的位置存储的是key内容的偏移量,key的内容(即keyBuf)保存在后面。

为了简化编程和节省内存,我把结点分为只读结点和可写结点。可写结点把内容全部解析为结构化对象。目前叶结点和非叶结点目前还没有拆分。

等于的情况下向左还是向右

如果一个值等于key那么放在它的左子树还是右子树呢?

  • 书上说放在右子树。在这种情况下,如果有重复的key情况下,对应的分割点值必须是“第一个新值”,第一个新值计算比较麻烦。
  • 于是我规定等于的情况下放入左子树,这样对应的分割点key就是子结点的最后一个值(对于叶节点来说是倒数第二个)。

叶结点存储卫星数据

叶结点到底是存储数据的指针还是数据本身呢?

  • 如果存储数据指针,那么需要单独的数据页。数据页如果删除记录或者分裂,会导致指针地址失效,需要逆向更新索引。或者用占位的方式做永久地址,但不适合数据改动频率比较高的应用。
  • 如果页结点存储数据本身,那么辅助索引无法通过指针来引用,辅助索引通过id来查询。这样辅助索引上查询效率比存储指针低。目前是这种方式。

最后的虚拟key

指针的个数比key的个数多一个,我们给最好增加一个虚拟key,这样方便处理。[ptr,key]作为一个元组item。

在叶子结点的情况下最后一个item不存储数据,而是存储指向下一个兄弟,这是为了能支持区间查询和全表扫描。

非叶子结点最后一个vkey存储这个item指针指向子树的最大key。存储最大key是为了在分裂时能快速确定分裂时父结点对应项的key值。

当插入数据的搜索比较key时规定这个vkey比任何值都大,这样能保证数据插入当此处而不是新增结点。

重复key

目前的实现不允许存在重复key,尽管“第一个新值”的讨论里面考虑到了这种情况。 但是重复key能通过另一个简单方法解决,那就是在插入时发现已存在时可以选择是覆写还是追加。 如果使用追加方式,相当于我们有一个支持重复key的功能了。

转载于:https://my.oschina.net/chunquedong/blog/823249

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值