本章定义核心 PostgreSQL 系统与管理各个索引类型的索引访问方法之间的接口。核心系统除了此处指定的内容之外,对索引一无所知,因此可以通过编写附加代码来开发全新的索引类型。
在 PostgreSQL 中的所有索引在技术上称为辅助索引;也就是说,索引在物理上与它描述的表文件是分开的。每个索引都存储为它自己的物理关系,因此由 pg_class
目录中的一个条目来描述。索引的内容完全由它的索引访问方法控制。在实践中,所有索引访问方法都将索引划分为标准大小的页面,以便它们可以使用常规存储管理器和缓冲区管理器来访问索引内容。(此外,所有现有的索引访问方法都使用 第 73.6 节 中描述的标准页面布局,并且大多数都使用相同的索引元组头格式;但这些决策不会强加给访问方法。)
索引实际上是从一些数据键值到索引父表中行版本(元组)的元组标识符或 TID 的映射。TID 由块号和该块内的项目号组成(请参阅 第 73.6 节)。这些信息足以从表中获取特定行版本。索引并不知道在 MVCC 下可能存在同一逻辑行的多个现有版本;对于索引来说,每个元组都是一个独立的对象,需要它自己的索引条目。因此,即使键值没有更改,对行的更新也会始终为该行创建全新的索引条目。(HOT 元组 是此语句的例外;但索引也不处理它们。)死元组的索引条目在死元组本身被回收时被回收(通过 vacuum)。