【问题标题】:B+ tree or B-treeB+树或B树
【发布时间】:2014-09-20 04:29:43
【问题描述】:

我正在学习 postgresql 内部结构,我想知道 postgresql B-tree 索引实际上是经典的 B-tree 还是 B+tree?说得清楚一点,就是说节点只包含键或者键值对?

【问题讨论】:

    标签: postgresql indexing b-tree


    【解决方案1】:

    我首先说的是 B-树,但可以说它更接近 B+ 树。
    请参阅iwis' answer 进行更彻底的讨论。

    您真的必须同时考虑索引 + 堆(+ 辅助存储)。索引本身几乎是无用的。

    这是related chapter on Wikipedia

    相关索引方法的名称是Postgres中的“B-tree”。物理存储与表(堆)或任何其他索引类型的存储非常相似。全部使用相同的数据页面,页面布局基本相同。 More in the manual.

    开发正在进行中。自从提出这个问题以来,设计已经在许多方面进行了更改(改进)。 Postgres 13 中的最新显着变化(截至 2021 年 4 月)是 deduplication

    【讨论】:

    • 但如果 db 只存储键,它会是 B+?
    • A b+ 树将数据存储在叶子中。 b 和 b+ 树之间的区别对于索引开始时没有多大意义。如果您愿意,索引和表一起形成了一种特殊形式的 b+ 树。索引本身只是一个 b-tree。
    • @ErwinBrandstetter 你的意思是postgres中的索引只是一个b-tree,它的叶子节点包含指向存储在磁盘中的实际数据的指针。
    • @a.m.:介于两者之间。索引包含定义中列出的列以及指向行的指针,即完整的“值”。
    • 关于“数据”的讨论会让人感到困惑,而且意义不大。理解这种区别的最好方法是,在朴素的 b+tree 中,内部节点中的键将在叶子中重复,而在 b-tree 中,如果键存储在内部节点中,则不会也存储在一片叶子中。绝对的情况是,b+trees 经常被用作“数据”部分是对完整记录的引用的索引。 b+tree 的一大优势很简单,因为所有内容都存储在叶子中,因此您可以将叶子变成链表,并且范围查询的迭代速度非常快。
    【解决方案2】:

    在我看来 PostgreSQL 使用 B+ 树。

    B-tree和B+树的区别

    • 在 B 树中,指向索引表中记录的指针不仅在树的叶子中,而且在树的所有内部节点中。
    • 在 B+ 树中,指向索引表中记录的指针仅位于树的叶子中。 B+树相对于B树的优势在here中描述。

    (图片为this picture的修改)

    B+ 树在 DBMS 中的使用

    Oracle, SQL Server, SQLite, DB2MySQL 使用 B+ 树。似乎 PostgreSQL 也使用 B+ 树,因为:

    • documentation 似乎表明只有树的叶子有指向索引表中记录的指针:

      每个叶页都包含指向表行的元组。每个 内部页面包含指向下一层的元组 树。

    • 当 Bruce Momjian says 关于内部节点时,他没有提到它们有指向索引表中记录的指针。

    • 文档中提到的PostgreSQL源代码的src/backend/access/nbtree/README文件包含这样的注释:

      Btree 索引

      此目录包含雷曼和姚明高并发的正确实现 B树管理算法 (P. Lehman 和 S. Yao,Efficient Locking for Concurrent Operations on B-Trees, ACM Transactions on Database Systems,第 6 卷,第 4 期,1981 年 12 月,第 650-670 页)。

      Lehman 和 Yao 使用名为 B* 树 的树结构,该树结构由 Wedekind 在On the selection of access paths in a data base system 论文中定义为 B 树,其中非叶节点没有指向记录的指针索引表(它们只有指向其子节点的指针)。所以Wedekind定义的B*树结构就是B+树。

    【讨论】:

    • 我同意,实现更接近于 B+ 树。但讨论一开始并没有多大意义。您真的必须同时考虑索引和堆(以及 toast 表和其他辅助工具)。
    猜你喜欢
    • 1970-01-01
    • 2011-02-13
    • 2016-03-16
    • 2011-02-13
    • 2011-09-06
    • 1970-01-01
    • 2016-10-10
    • 2010-12-08
    • 1970-01-01
    相关资源
    最近更新 更多