为什么我们需要像B-Tree这样的单独数据结构用于数据库和文件系统?

时间:2012-10-10 12:11:29

标签: data-structures tree binary-tree binary-search-tree b-tree

我正在阅读B树,看起来他们在O(lg n)时间内实现了动态集合操作。红黑树(Java中的TreeMap)也在渐近相同的时间范围内实现相同的操作。所以我想知道是什么让B树对数据库和文件系统更有用

3 个答案:

答案 0 :(得分:22)

存在B树的主要原因是为了更好地利用读取和写入大块数据的设备的行为。当数据必须存储在磁盘上时,两个属性对于使B-Tree比二叉树更好是很重要的:

  • 访问磁盘非常慢(与内存或缓存相比,对磁盘上数据的随机访问速度要慢几个数量级);和
  • 每次读取都会导致整个扇区从驱动器加载 - 假设扇区大小为4K,这意味着1000个整数,或者您存储的数十个较大的对象。

因此,我们可以使用第二个事实的优点,同时也最小化缺点 - 即磁盘访问次数。

因此,我们可以创建一个更大的索引来告诉我们是否应该继续使用前1/100,而不是仅在每个节点中存储一个数字,告诉我们是否应该继续向左或向右移动。到第二个或第99个(想象一下图书馆中的书籍,按照第一个字母排序,然后按第二个字母排序,依此类推)。只要所有这些数据都适合单个扇区,它就会被加载,所以我们不妨完全使用它。

这导致大致log b N次查找,其中N是记录数。这个数字渐渐地与log 2 N相同,实际上是N和b足够小的几倍 - 因为我们讨论的是将数据存储到磁盘以便在数据库等中使用。 ,数据量通常足以证明这一点。

设计决策的其余部分主要是为了使这个有效地工作,因为修改N-ary树比二元树更棘手。

答案 1 :(得分:8)

RB树是二叉搜索树。 B树可以有两个以上的子节点。实际上,子节点的数量是可变的。

因此,您可以改变子节点的数量,使节点的大小始终是文件系统块大小的倍数。这样可以减少阅读时的浪费:无论如何,你不能读取少于一个的块,你总是必须阅读整个块,所以你也可以用有用的数据填充它。增加子节点的数量也将减少树的深度,从而减少“跳跃”的平均数量(即磁盘读取),这再次提高了性能。

请记住:B树通常用于存储比内存大更大的数据结构,而RB树通常用于存储数量级更小的数据结构< / em>比记忆。实际上,B树是专门设计为磁盘数据结构而不是内存数据结构。

这是Wikipedia article(强调我的)的关键句子:

  

对于读取和写入大块数据

的系统,B树已优化

答案 2 :(得分:2)

我们需要不同的算法,因为内存中的访问速度比磁盘上的访问速度快得多。红色/黑色树可以进行许多内存访问,因此它可以很好地跟踪内存的快速访问速度。 b树进行的访问次数越来越少,因为访问的磁盘速度很慢。