大键和值如何存储在具有小扇区的 b 树中?

How are large keys and values stored in b-trees with small sectors?

我一直在制作一个键值存储,作为个人项目保存到磁盘,我一直在使用 b 树作为我的数据结构,但我想对键和值的长度增加很大的限制像许多其他键值存储,如 redis。

当扇区大小只有 512 字节时,大键和值应该如何存储在 b 树中?如果你允许更大尺寸的键和值,你应该允许每个节点有多少个键,我是否应该考虑考虑另一种数据结构来存储可变大小的数据?

您可以定义溢出页面以从页面链表中形成节点,或者您可以通过存储在 b 树叶节点中的指针来引用键和值。指针可以指向一个链接的页面列表或一种特殊的子树。如果这样可以减少由于未填充页面造成的浪费,您可以在叶节点中存储一些内联内容。

进行溢出设计时每个节点允许多少个键?尽可能少。该设计不会随着链表变大而缩放。如果出于某种原因您需要存储非常大的值,您会发现这种设计可能会非常昂贵,因为您必须扫描并跳过这么多额外的页面。

基于指针的方法扩展性更好,但要使其对键最有效,必须尽可能多地内联键。否则,您在搜索时必须始终遵循指示。您可以潜在地应用指针压缩技术,其中公共前缀存储一次。这允许更多的键适合页面,减少跟随指针的可能性。