在b-树中,您可以将键和数据存储在内部节点和叶节点中,但在b+树中,您必须仅将数据存储在叶节点中。

在b+树中这样做有什么好处吗?

为什么不在所有地方都使用b-树而不是b+树,因为直觉上它们看起来更快?

我的意思是,为什么需要在b+树中复制键(数据)?


当前回答

Adegoke A, Amit

我想你们忽略的一个关键点是数据和指针之间的区别,就像本节中解释的那样。

指针:指向其他节点的指针。

数据:—在数据库索引的上下文中,数据只是另一个指向其他地方的真实数据(行)的指针。

因此在B树的情况下,每个节点都有三个信息键,指向与键相关的数据的指针和指向子节点的指针。

在B+树中,内部节点保存指向子节点的键和指针,而叶节点保存指向相关数据的键和指针。这允许为给定大小的节点提供更多的键数。节点大小主要由块大小决定。

每个节点拥有更多键的好处已经在上面解释过了,这样可以节省我的输入工作量。

其他回答

在B+树中,由于只有指针存储在内部节点中,因此它们的大小明显小于B树的内部节点(存储数据+键)。 因此,B+树的索引可以在一次磁盘读取中从外部存储中提取,处理后找到目标的位置。如果它是一个B树,那么每个决策过程都需要读取磁盘。希望我把我的观点讲清楚了!:)

Adegoke A, Amit

我想你们忽略的一个关键点是数据和指针之间的区别,就像本节中解释的那样。

指针:指向其他节点的指针。

数据:—在数据库索引的上下文中,数据只是另一个指向其他地方的真实数据(行)的指针。

因此在B树的情况下,每个节点都有三个信息键,指向与键相关的数据的指针和指向子节点的指针。

在B+树中,内部节点保存指向子节点的键和指针,而叶节点保存指向相关数据的键和指针。这允许为给定大小的节点提供更多的键数。节点大小主要由块大小决定。

每个节点拥有更多键的好处已经在上面解释过了,这样可以节省我的输入工作量。

定义“快得多”。渐近地它们是相同的。不同之处在于它们如何使用二级存储。维基百科上关于B-树和B+树的文章看起来相当可信。

The primary distinction between B-tree and B+tree is that B-tree eliminates the redundant storage of search key values.Since search keys are not repeated in the B-tree,we may not be able to store the index using fewer tree nodes than in corresponding B+tree index.However,since search key that appear in non-leaf nodes appear nowhere else in B-tree,we are forced to include an additional pointer field for each search key in a non-leaf node. Their are space advantages for B-tree, as repetition does not occur and can be used for large indices.

下图有助于显示B+树和B树之间的区别。

B+树的优点:

Because B+ trees don't have data associated with interior nodes, more keys can fit on a page of memory. Therefore, it will require fewer cache misses in order to access data that is on a leaf node. The leaf nodes of B+ trees are linked, so doing a full scan of all objects in a tree requires just one linear pass through all the leaf nodes. A B tree, on the other hand, would require a traversal of every level in the tree. This full-tree traversal will likely involve more cache misses than the linear traversal of B+ leaves.

B树的优点:

因为B树包含每个键的数据,所以经常访问的节点可以位于更靠近根的位置,因此可以更快地访问。