2016-06-09 113 views
0

我正在编写一个程序来检索给定范围内的对象数,并且我使用B-树数据结构来实现我的解决方案,因为对象数不能放入RAM中。我遇到过几篇文章,说B +树在范围查询方面远远优于B树,并被所有主要的数据库实现所使用。我无法理解为什么B +树优于B树,因为所有数据都存储在叶上,并且需要h(树的高度)磁盘访问来检索节点并在B树中执行范围查询可能位于父节点上,因此磁盘访问将会最小化。此外,如果我有一个查询,例如返回一个特定键的对象,那么我可能能够找到该键,然后像在B +树中一样一直下降到树叶。那为什么他们说B +树比B树更有效呢?如果我必须编写一个程序来执行范围查询,那么B树不应该是正确的数据结构吗?提前感谢您的回复!使用B树和B +树的范围查询

回答

0

实际的B树和B +树实现倾向于具有固定字节大小的节点,该节点的大小被选择为与架构的页大小或另一个像磁盘上簇大小的夹具相匹配。典型的值将是4096字节。

B +树可以将更多的密钥放入内部节点,因为记录数据不需要空间。由于与B树相比,给定的一组索引页(内部节点)“覆盖”了更多的查询,这给出了更高的扇出(更低的树高度)和更好的缓存利用率。

B +树的第二个优点是内部节点中的密钥只用于路由搜索到右边的叶子。他们只需要将他们左边的东西与他们右边的东西分开,但他们不必与任何实际的记录键相对应。这意味着它们通常可以缩短,这也意味着删除不必从叶层传播到索引层(即,一旦从叶中删除了一个键,就完成了 - 没有必要删除内部节点中的任何内容,除了在重新链接期间自然发生的情况)。

另外,在一个典型的B +树中,叶节点有指向其左右兄弟姐妹的指针。这意味着您可以通过遍历页面的链表来遍历一系列记录,而不必使用B树典型的棘手迭代逻辑。

在B树的间隔可以位于父节点和磁盘访问

将因此最小化

要躺在该理论休息,估计有多少键总共位于的内部节点B树和总共有多少个密钥位于叶节点中。该比率表示搜索可以提前停止的频率,然后一直下降到叶级别。注意:早期情况只适用于密钥恰好存在于树中的查询;否则体面到叶级是不可避免的。