- 主题:请问一个数据库索引的问题 (转载)
【 在 chunhui 的大作中提到: 】
: 我的需要是查找的时候把同一个key的多个值一下都读出来。这样的话,第二层树其实有点浪费,因为这一层本不需要查找。
所谓二层不就是secondary db吗, 也就是次索引。
berkeley db里面, 次级索引就是一个二级表而已, 至于浪不浪费也得看需求吧, 即便现在没需求,
也得要考虑以后会不会扩展。
实现上, 就是B+数的磁盘表示, 根据内容大小, 把硬盘空间分页,页满了,B+树也是动态扩展。
--
FROM 124.126.1.*
【 在 chunhui 的大作中提到: 】
: 这种我想过,但是b+树的第二级表怎么表示?
: 首先通过第一级b+树找到这个key的节点。它指向另一个地方。这个地方需要存一些同是这个key的值。关键就是这个值的数量不是固定的。需要在磁盘上给值也分配一种块,比如专门存值的块 100个字节。块还需要链接起来,因为一个块可能不够。。。。
: 是这个思路?
我不太懂数据库,不过, 我看数据库的B+树项是放到页表了的, 它的空间分配,并不是以节点为单位,
而是, 页表块为单位, 所以, 数据库存储开始是有冗余的, 插入数据, 节点分裂, 页表满了,
需要扩展分裂, 我猜测, overflow页,也许就是类似链表页。
--
修改:poggy FROM 124.126.1.*
FROM 124.126.1.*
【 在 chunhui 的大作中提到: 】
: 这种我想过,但是b+树的第二级表怎么表示?
: 首先通过第一级b+树找到这个key的节点。它指向另一个地方。这个地方需要存一些同是这个key的值。关键就是这个值的数量不是固定的。需要在磁盘上给值也分配一种块,比如专门存值的块 100个字节。块还需要链接起来,因为一个块可能不够。。。。
: 是这个思路?
我觉得, B+树, 相同的值, 并不影响排序, 并没有理由合并到一个节点里面, 索引也是按照游标找到第一个点, 然后往下访问就行了, 无论是相同值还是要求范围值, 都是依条件按序访问的,并没有区别。
--
FROM 124.126.1.*
【 在 chunhui 的大作中提到: 】
: 不是这样的。b+树的前提之一就是key唯一。
哦, 那看来我的印象模糊了, 因为我记得berkeley的BTree也是支持主键重复的记录的。
hash结构的表, 通过拉链实现, 不知道berkeley db Btree里面做的什么特殊处理。
--
FROM 124.126.1.*
【 在 chunhui 的大作中提到: 】
: 我也想知道有什么办法。搜了一圈。有说用overflow page。但没说怎么弄。提到了会浪费空间。想必是用b+树的page来存重复键值。
我不太明白, 你的需求, 如果只是使用, 很简单啊, 这些现成的kv数据库, 使用很简单,
没有什么你需要不需要的问题, 如果是python, 就是装个库, 10行二十行调用代码就解决了。
如果是c, 复杂点, 也只不过编译的时候, 多链接一个库, 甚至可以静态库编译到到程序里,
当然, 需要注意一下软件协议, 使用低一点的版本, 我记得5点几的, 高的6到8的版本, 好像
属于oracle, 商用有限制。
--
FROM 124.126.1.*