在b -树中,可以同时存储内部节点和叶节点中的键和数据,但在b +树中,必须将数据存储在仅叶节点中。
在b+树中这样做有什么好处吗?
为什么不在所有地方都使用b-树而不是b+树,因为直觉上它们看起来更快?
我的意思是,为什么需要在b+树中复制键(数据)?
定义“快得多”。渐近地它们是相同的。不同之处在于它们如何使用二级存储。维基百科上b树和B +树的文章看起来相当可信。
B+树相对于B树的主要优点是,它们允许您通过删除指向数据的指针来打包更多指向其他节点的指针,从而增加扇出并潜在地降低树的深度。
缺点是,当您可能在内部节点中找到匹配时,无法提前退出。但由于这两种数据结构都有巨大的扇出,绝大多数匹配都将在叶节点上,这使得B+树的平均效率更高。
B+树尤其适用于基于块的存储(例如:硬盘)。考虑到这一点,你会得到几个优势,例如(从我的脑海中):
高扇出/低深度:这意味着你必须获得更少的块来获取数据。由于数据与指针混合在一起,每次读取得到的指针更少,因此需要更多的查找来获取数据
简单一致的块存储:内部节点有N个指针,没有其他,叶节点有数据,没有其他。这使得它易于解析、调试甚至重构。
高键密度意味着顶部节点几乎肯定在缓存中,在许多情况下,所有内部节点都被快速缓存,因此只有数据访问必须到磁盘。
由于终端节点形成了一个链表,B+树更容易进行全面扫描,而且性能更高,可以查看树索引的每一块数据。要使用B-Tree进行完整扫描,您需要进行完整的树遍历以查找所有数据。
另一方面,当您执行seek(按键查找特定数据段)时,B-Trees可以更快,特别是当树驻留在RAM或其他非块存储中时。由于可以提升树中常用的节点,因此获取数据所需的比较较少。
举个例子——你有一个每一行都有大量数据的表。这意味着对象的每个实例都是大的。
如果在这里使用B树,那么大部分时间都花在扫描带有数据的页面上——这是没有用的。在数据库中,这就是使用B+树来避免扫描对象数据的原因。
B+树将键和数据分开。
但如果你的数据量比较小,你可以用键来存储它们就像B树那样。
下图有助于显示B+树和B树之间的区别。
B+树的优点:
B树的优点:
**
B-Tree的主要缺点是遍历键的困难 按顺序。B+树保留了的快速随机访问属性 同时还允许快速顺序访问
< a href = " http://books.google.co.in/books?id=X0Cd1Pr2W0gC& pg = PA456&液化石油气= PA456& dq =缺点+ + b - tree +是+ + +的+穿越困难+ +键+ sequentially&源= bl& ots = pGcPQSEJMS&团体= F9MY7zEXYAMVKl_Sg4W-0LTRor8& hl = en& sa = X& ei = nD5AUbeeH4zwrQe12oCYAQ& ved = 0 cdsq6aewag # v = onepage& q = % 20的缺点% 20 b - tree % 20的% 20困难% 20 % 20 % 20遍历% 20 % 20键% 20 sequentially& f = false”rel = " noreferrer " > http://books.google.co.in/books?id=X0Cd1Pr2W0gC& pg = PA456&液化石油气= PA456& dq =缺点+ + b - tree +是+ + +的+穿越困难+ +键+ sequentially&源= bl& ots = pGcPQSEJMS&团体= F9MY7zEXYAMVKl_Sg4W-0LTRor8& hl = en& sa = X& ei = nD5AUbeeH4zwrQe12oCYAQ& ved = 0 cdsq6aewag # v = onepage& q = % 20的缺点% 20 b - tree % 20的% 20困难% 20 % 20 % 20遍历% 20 % 20键% 20 sequentially& f = false < / >
Adegoke A, Amit
我想你们忽略的一个关键点是数据和指针之间的区别,就像本节中解释的那样。
指针:指向其他节点的指针。
数据:—在数据库索引的上下文中,数据只是另一个指向其他地方的真实数据(行)的指针。
因此在B树的情况下,每个节点都有三个信息键,指向与键相关的数据的指针和指向子节点的指针。
在B+树中,内部节点保存指向子节点的键和指针,而叶节点保存指向相关数据的键和指针。这允许为给定大小的节点提供更多的键数。节点大小主要由块大小决定。
每个节点拥有更多键的好处已经在上面解释过了,这样可以节省我的输入工作量。
数据库系统概念示例