我正在研究 B+树的索引,我试图理解的不仅仅是记住结构。据我了解,B+树的内部节点在叶子上形成一个索引,叶子包含指向数据在磁盘上存储位置的指针。正确的?那么查找是如何进行的呢?如果 B+tree 比二叉树好得多,为什么我们不到处使用 B+tree 而不是二叉树呢?
我阅读了关于 B+ 树的维基百科文章,我了解其结构,但不了解实际查找的执行方式。你能指导我一些阅读材料的链接吗?
除了数据库索引之外,B+ 树还有哪些其他用途?
我正在研究 B+树的索引,我试图理解的不仅仅是记住结构。据我了解,B+树的内部节点在叶子上形成一个索引,叶子包含指向数据在磁盘上存储位置的指针。正确的?
不,索引由内部节点(非叶子)形成。根据实现,叶子可能包含键/值对或键/指向值对的指针。例如,数据库索引使用后者,除非它是 IOT(索引组织表),在这种情况下,值内联在叶子中。这主要取决于密钥的值是否非常大。
那么查找是如何进行的呢?
在根节点不是叶子的一般情况下(起初确实会发生),根节点包含一个由 N 个键和 N+1 个指针组成的排序数组。您对两个键 S0 和 S1 进行二进制搜索S0 <= K < S1
(其中 K 是您要查找的内容),这将为您提供指向下一个节点的指针。
你重复这个过程,直到你(最终)点击一个叶子节点,它包含一个排序的键值对列表,并对它们进行最后的二分搜索。
如果 B+tree 比二叉树好得多,为什么我们不到处使用 B+tree 而不是二叉树呢?
你能指导我一些阅读材料的链接吗?
我希望我解释的粗略算法有所帮助,否则请随时在评论中提问。
除了数据库索引之外,B+ 树还有哪些其他用途?
同样:文件系统索引也有好处。
这个想法总是一样的:B+Tree 非常适合小键/大值和缓存。这个想法是让所有的键(内部节点)都在你的快速内存中(CPU 缓存 >> RAM >> 磁盘),B+Tree 通过将键推到底部来实现大型集合。由于所有内部节点都在快速内存中,每次搜索时您只有一次慢速内存访问(以获取值)。
B+ 树比二叉树好,所有 dbms 都使用它们,
在 B+Tree 中查找是 LOGF N 是 F LOG 的基数和扇出。查找的执行方式与二叉树完全相同,但扇出更大且高度更低,这就是为什么它更好的原因。
B+Tree 通常以在叶子中拥有数据而闻名(如果它们是非集群的,则可能不是),这意味着您不必再次跳转到磁盘来获取数据,您只需从叶子中获取数据。
B+Tree 几乎无处不在,操作系统使用它们,数据仓库(这里不多,但仍然如此),许多应用程序。
B+Tree 非常适合范围查询,只要您有唯一值(如主键或任何具有低基数的字段),就可以使用 B+Tree。
如果你能得到这本书http://www.amazon.com/Database-Management-Systems-Raghu-Ramakrishnan/dp/0072465638它是最好的之一。它基本上是任何数据库人员的圣经。