Postgresql B+;树还是B树

Postgresql B+;树还是B树,postgresql,indexing,b-tree,Postgresql,Indexing,B Tree,我正在学习postgresql的内部结构,我想知道postgresql的B-树索引实际上是经典的B-树还是B+树?更详细地说,这意味着节点只包含键或键值对?我首先说的是B-树,但可以说它更接近B+树。 请参阅更深入地讨论它 你真的必须考虑索引+堆(+辅助存储)。索引本身基本上是无用的 这是一本书 相关索引方法的名称在Postgres中为“B-树”。物理存储非常类似于表(堆)或任何其他索引类型。它们都使用相同的数据页,并且页面布局基本相同 发展正在进行中。自从提出这个问题以来,设计在许多方面都有所

我正在学习postgresql的内部结构,我想知道postgresql的B-树索引实际上是经典的B-树还是B+树?更详细地说,这意味着节点只包含键或键值对?

我首先说的是B-树,但可以说它更接近B+树。
请参阅更深入地讨论它

<>你真的必须考虑索引+堆(+辅助存储)。索引本身基本上是无用的

这是一本书

相关索引方法的名称在Postgres中为“B-树”。物理存储非常类似于表(堆)或任何其他索引类型。它们都使用相同的数据页,并且页面布局基本相同


发展正在进行中。自从提出这个问题以来,设计在许多方面都有所改变(改进)。最新的显著变化(截至2021年4月)出现在Postgres 13中。

在我看来,PostgreSQL使用了B+树

B-树与B+树的区别
  • 在B-树中,索引表中记录的指针不仅在树的叶子中,而且在树的所有内部节点中
  • 在B+树中,指向索引表中记录的指针仅在树的叶子中。描述了B+树相对于B-树的优点
(图片是对

B+树在dbms中的应用 ,并使用B+树。PostgreSQL似乎也使用B+树,因为:

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

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

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

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

    树索引 此目录包含Lehman和Yao的高并发性的正确实现 B-树管理算法 (P.Lehman和S.Yao, 《数据库系统上的ACM交易》,第6卷,第4期,1981年12月,第650-670页)

    Lehman和Yao使用名为B*tree的树结构,Wedekind在论文中将其定义为B-tree,其中非叶节点没有指向索引表中记录的指针(它们只有指向其子节点的指针)。所以Wedekind定义的B*树结构是B+树


但如果db只存储密钥,它将是B+?B+树将在叶子中存储数据。b和b+树之间的区别对于索引一开始就没有多大意义。如果您愿意的话,索引和表一起构成了b+树的一种特殊形式。索引本身只是一个b-树。@ErwinBrandstetter您的意思是postgres中的索引只是一个b-树,其叶节点包含指向存储在磁盘中的实际数据的指针。@a.m.:介于两者之间。索引包含定义中列出的列以及指向该行的指针,该行是完整的“值”。有关“数据”的讨论令人困惑,没有意义。理解这种区别的最好方法是,在一个朴素的b+树中,内部节点中的键将在叶子中重复,而在b-树中,如果键存储在内部节点中,它也不会存储在叶子中。绝对是这样,b+树经常被用作指示,其中“数据”部分是对完整记录的引用。b+树的最大优势在于,因为所有内容都存储在叶子中,所以可以将叶子制作成链表,并对范围查询进行非常快速的迭代。我同意,实现更接近于b+树。但讨论一开始就没有多大意义。你真的必须考虑索引和堆(和吐司表和其他辅助设备)在一起。