【发布时间】:2014-09-20 04:29:43
【问题描述】:
我正在学习 postgresql 内部结构,我想知道 postgresql B-tree 索引实际上是经典的 B-tree 还是 B+tree?说得清楚一点,就是说节点只包含键或者键值对?
【问题讨论】:
标签: postgresql indexing b-tree
我正在学习 postgresql 内部结构,我想知道 postgresql B-tree 索引实际上是经典的 B-tree 还是 B+tree?说得清楚一点,就是说节点只包含键或者键值对?
【问题讨论】:
标签: postgresql indexing b-tree
我首先说的是 B-树,但可以说它更接近 B+ 树。
请参阅iwis' answer 进行更彻底的讨论。
您真的必须同时考虑索引 + 堆(+ 辅助存储)。索引本身几乎是无用的。
这是related chapter on Wikipedia。
相关索引方法的名称是Postgres中的“B-tree”。物理存储与表(堆)或任何其他索引类型的存储非常相似。全部使用相同的数据页面,页面布局基本相同。 More in the manual.
开发正在进行中。自从提出这个问题以来,设计已经在许多方面进行了更改(改进)。 Postgres 13 中的最新显着变化(截至 2021 年 4 月)是 deduplication。
【讨论】:
在我看来 PostgreSQL 使用 B+ 树。
(图片为this picture的修改)
Oracle, SQL Server, SQLite, DB2 和 MySQL 使用 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+树。
【讨论】: