如果元素大小不同,如何维护B树不变量?

时间:2012-04-06 23:41:45

标签: database b-tree

对于阶数为m的B树,除根之外的每个节点必须包含m-1到2m-1个元素,其中每个元素至少是一个键,也可能是一些附加数据(例如,一个值)。然而,每个节点必须具有一些恒定的总大小,以便在底层块设备上提供良好的性能。那么如果您的元素大小可变会发生什么呢?

SQLite3似乎有一个方案可以在其节点上添加其他块大小的块,而MySQL允许您声明记录的大小(例如,您可以键入您的字段不仅仅是字符串而是某些大小的字符串)。还有哪些其他解决方案?当人们选择一个时,人们会怎么想?

编辑:在上一句话中,我的意思是,当决定实施他们的B树时,数据库开发人员会怎样思考另一种方式?

(我现在正在数据库课程中,所以我对理论和设计角度比对特定系统的细节更感兴趣。)

2 个答案:

答案 0 :(得分:1)

我知道SQL Server的密钥长度最多可达900字节,页面大小为8192字节。如果你实际上有900个字节的密钥,那么只有9(或8)行适合索引的中间级页面。这只意味着分支因子低于平常。这可能违反了理论上的B树不变量,但这只是一个学术上的关注点,它不会以显着的方式阻碍性能。它不会改变所涉算法的渐近复杂性。

简而言之:这是一个纯粹的学术问题。

答案 1 :(得分:0)

我认为这是一个非常好的问题。尽管RDBMS供应商的实现略有不同,但基础理论是相同的,我怀疑是否有人使用b-tree实现作为选择供应商的决定因素。

据我了解,每个b-tree页面的基本结构都包含键和指针。指针不断引用包含更多键和指针的其他页面,最后一个指针引用相关的数据记录。

如何处理可变长度键非常有趣。也许其他人可以对供应商特定解决方案有所了解。