B树减少了多少磁盘访问量?

时间:2015-12-26 12:51:52

标签: data-structures b-tree

我刚读过B树数据结构,我有一些问题。我怀疑在任何一个博客中都没有解释过(也许它太明显了,而且我很想念它)。

B树应该通过降低树的高度来减少磁盘访问。因此,如果减少磁盘访问次数是主要关注点,那么它有多大差异?假设我只使用二叉树,那么我的节点比n-ary B树的节点需要更少的空间。所以我可以在页面中容纳更多节点,就像我可以使用胖B树节点一样。它如何影响磁盘访问?我们只讨论最坏的情况吗?

3 个答案:

答案 0 :(得分:4)

您必须了解B树通常用于您有分页数据访问的系统。这通常是数据库系统。页面本质上是一块内存块,您必须立即读取(和写入)。如果不阅读整个页面,就无法阅读页面的各个部分。

重要的是:从磁盘读取内存是很昂贵的;比使用已经在内存中的页面做任何事情更昂贵的方式。因此,您希望尽量减少必须阅读的页数。

为了这个目的,B树比二叉树有几个好处 - 考虑到它们是专为此目的而设计的,这一点不足为奇。

其中一个好处是降低了身高。如果你使用普通的二叉树,你可以在那些内快速搜索。但是在这样做的同时,你走得很深。具有100万个元素的树已经具有20的深度。因此,假设它是平衡的,则需要向下走20个节点。与B树相比,高度要低得多。如果孩子数量为10(非常低 btw。),我们已经将高度降低到大约6.因此我们需要进行更少的比较,并且可能会减少很少的页面。通常,以某种方式选择B树的顺序(即每个节点具有的子节点数),因此单个节点填充整个页面。现在这可能听起来很愚蠢,因为你需要在那个节点的密钥内进行搜索,但它会大大减少深度,因此你必须阅读的页面数量很多。

另一个好处是B树是平衡的。这可以确保所有节点始终填充大约相同数量的子节点。通常,这大约是其容量的75%。由于节点填满整个页面,这意味着持有节点的每个页面都填充到其容量。这是非常好的,因为它优化了节点使用的空间,并避免了不包含信息的页面中的漏洞(这对二叉树来说是一个大问题,因为它们不能通过设计来平衡)。另一个非常重要的影响是,这也确保了查找元素的操作数(以及运行时)是一致的。因此,对于所有情况,您都有一个非常可预测的性能。对于数据库而言,这通常比具有可能在性能上有所不同的更好的最佳或平均情况重要得多。

还有其他好处,比如不仅叶片都在同一水平,而且物理上彼此靠近,因为这会在迭代元素时改善寻道时间。

基本上,B树针对分页数据访问进行了优化,这使得它们非常特殊并且针对这些目的进行了微调,使它们能够胜过经典的二叉树(在许多其他应用程序中更简单,更高效)。

答案 1 :(得分:1)

B代表平衡,表示在B树中,每个节点的左侧和右侧大致保持相同的大小(子节点数)。

考虑这个例子: 将数字添加到二叉树中,如下所示:如果新数字大于当前节点,则将其添加到右侧,否则以相同方式添加到左(子)树。

A)想想如果按升序添加1到100之间的数字会发生什么。

B)现在想象一下,如果你像50,25,75,12,37,62,87那样添加它们会发生什么...(这是在间隔的中间开始,然后递归地添加中间点新的间隔)

B树以这样的方式添加新节点,即使您按照A中的顺序添加它们,生成的树也类似于B)生成的树

AS用于磁盘访问,只需要想象必须从A)和B)中查找树中的节点100,并比较您必须处理多少个节点(磁盘访问)才能到达它。

修改 正如评论中指出的那样,上面提到的B树不太正确。

B树更像是排序(节点)列表的树,也就是说,每个节点由一个排序的密钥列表(具有可变但有限的长度)组成,每个密钥都引用一个子节点或leaf(数据节点)。这允许树比平衡二叉树更平坦(这基本上就是我上面描述的)。每个节点可以被视为必须完整读取的数据块或数据页。由于树相对平坦,因此查找特定数据点所必须读取的页数较少。 B树中查找的复杂性与平衡二叉树(或者对于该问题的排序列表上的简单二进制搜索)相当。不同之处在于必须在一个步骤中处理的键/数据的数量。二进制树需要每级对一个数据点进行一次读操作,有序列表要求一次读取所有数据,并且每个级别需要一块数据,B树位于中间。从一些操作的角度来看是无关紧要的,从内存访问的角度来看它是非常重要的。从磁盘读取数据时,块的大小(只要有限)不如所需的单独读取操作的数量。

答案 2 :(得分:1)

目标是尽量减少磁盘搜索。读取或写入的字节数是次要的,因为顺序速度比磁盘上的随机访问速度快100倍。

这就是树高很重要的原因。

此外,树页应映射到物理设备块。如果每个节点只有两个值,则很难利用物理磁盘块所具有的所有空间。