我正在编写一个程序来检索给定范围内的对象数量,并且我正在使用B树数据结构来实现我的解决方案,因为对象的数量无法容纳在RAM中。我看到几篇文章说B +树远远优于B树进行范围查询,并且被所有主要的数据库实现使用。我无法理解为什么B +树优于B树,因为所有数据都存储在叶子上,并且需要h(树的高度)磁盘访问来检索节点并执行范围查询,而在B树中间隔可以位于父节点上,从而最小化磁盘访问。此外,如果我有一个查询,例如返回特定键的对象#,那么我可以找到键,然后一直下降到叶子,就像在B +树中一样。那么为什么他们说B +树比范围查询的B树更有效呢?如果我必须编写一个程序来执行范围查询,那么B树是不是正确的数据结构?提前感谢您的回复!
答案 0 :(得分:1)
实用B树和B +树实现往往具有固定字节大小的节点,选择该节点以匹配架构的页面大小或其他夹具(如磁盘上的簇大小)。典型值为4096字节。
B +树可以将更多的密钥放入内部节点,因为记录数据不需要空间。这样可以提供更高的扇出(更低的树高)和更好的缓存利用率,因为给定的一组索引页(内部节点)'覆盖'的查询次数比B树的情况要多。
B +树的第二个优点是内部节点中的密钥仅用于将搜索路由到右侧叶子。他们只需要将左边的东西与右边的东西分开,但它们不必与任何实际的记录键相对应。这意味着它们通常可以缩短,这也意味着删除不必从叶子层传播到索引层(即,一旦从叶子中删除了一个键,就完成了 - 不需要删除内部节点中的任何内容,除了在重新平衡期间自然发生的事情)。
此外,在典型的B +树中,叶节点具有指向其左右兄弟的指针。这意味着您可以通过遍历链接的页面列表来迭代一系列记录,而不必使用B树典型的棘手迭代逻辑。
在B树中,间隔可以位于父节点上,因此磁盘访问将最小化
要使该理论停下来,估计B树的内部节点中总共有多少个密钥,以及叶子节点中总共有多少个密钥。该比率告诉您搜索可以提前停止的频率,然后一直下降到叶级别。注意:早期的场景仅适用于 exact 键恰好出现在树中的查询;否则一个体面的叶子是不可避免的。