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