章 58. 索引访问方法接口定义

目录
58.1. 索引的目录项
58.2. 索引访问方法函数
58.3. 索引扫描
58.4. 索引锁定注意事项
58.5. 索引唯一性检查
58.6. 索引开销估计函数

本章定义核心PostgreSQL系统和管理个别索引类型的 索引访问方法之间的接口。除了在这里指定的内容之外, 核心系统对索引一无所知,因此可以通过编写附加代码来开发全新的索引类型。

PostgreSQL中所有的索引在技术上都叫做 二级索引。也就是说,索引在物理上与它描述的表文件分离。 每个索引被存储为它自己的物理关系并且被pg_class 目录中的一个项所描述。一个索引的内容完全受到其索引访问方法控制。实际上, 所有索引访问方法都把索引划分成标准大小的页面, 这样它们就可以使用常规的存储管理器和缓冲区管理器来访问索引内容 (所有现有的索引访问方法还使用第 63.6 节中 描述的标准页面布局,并且它们都对索引元组头部使用相同的格式; 但是这些决定都不是强制在访问方法上的)。

索引实际上是一些数据键值与索引父表中行版本(元组)的元组标识符TIDs之间的映射。一个 TID 由一个块号和一个块内的项编号组成 (见第 63.6 节)。这对于从表中取一个特定行就足够了。 索引并不直接知道在 MVCC下,同一个逻辑行可能有多个现存的版本;对于索引而言, 每个行都是一个独立的对象,都需要自己的索引项。因此, 对一行的更新总是为该行创建全新的索引项,即使键值没有改变 (HOT 元组对这段陈述来说是个异常,但是索引也不会处理这些)。 死亡元组的索引项将随着死亡元组的回收而被回收(通过清理)。