PostgreSQL 提供了多种不同底层算法的索引类型:B-tree、Hash、GiST、SP-GiST、GIN、BRIN 以及扩展模块 bloom。每种索引类型采用不同的底层数据结构,分别适用于不同类型的查询运算符模式。在默认情况下,CREATE INDEX 命令创建的是适用场景最为广泛的 B 树(B-tree)索引。若要使用其他类型,可在命令中通过 USING 关键字显式声明,例如创建哈希索引:
CREATE INDEXnameONtableUSING HASH (column);
B 树索引能够高效处理支持线性标量排序数据的等值与范围查询。当查询条件包含以下比较运算符时,优化器会优先考量使用 B 树索引:
< <= = >= >
逻辑上等价于这些运算符组合的结构(如 BETWEEN 与 IN)同样能被 B 树索引高效处理。此外,作用于索引列的 IS NULL 与 IS NOT NULL 条件同样完美支持 B 树扫描。
如果模式匹配运算符 LIKE 与 ~ 的匹配模式是固定常量且锚定在字符串起始位置(前缀匹配,如 col LIKE 'foo%' 或 col ~ '^foo'),优化器同样可以使用 B 树索引(但形如 col LIKE '%bar' 的模糊后缀查询无法利用常规 B 树索引)。若数据库使用了非 C 语言区域设置,需要配合专用的操作符类创建索引以支持模式匹配(详见 Section 11.10)。
B 树索引天然以有序形式存储数据,因此能够直接用于满足查询中带有 ORDER BY 的排序需求,省去耗时的额外内存排序算子。
通用搜索树(Generalized Search Tree,简称 GiST)并非单纯的某种特定索引,而是一套高度抽象的可扩展索引基础设施,在其之上可以实现多种不同的具体索引算法。系统官方发行版中内置了针对二维平面几何类型的 GiST 操作符类,支持基于如下空间几何拓扑运算符的高性能空间检索:
<< &< &> >> <<| &<| |&> |>> @> <@ ~= &&
此外,GiST 索引还支持高效的“最近邻居”(K-近邻,KNN)距离排序检索:
SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;
该查询能够以毫秒级速度直接检索出距离目标坐标点物理距离最近的 10 条地点记录。详见 Section 65.2。
空间分区通用搜索树(Space-Partitioned GiST,简称 SP-GiST)是另一类支持非平衡磁盘数据结构(如四叉树、K-D 树以及基数树/字典树 Trie)的高级可扩展基础设施。它同样支持二维点类型的空间索引与最近邻距离搜索。详见 Section 65.3。
通用倒排索引(Generalized Inverted Index,简称 GIN)是专门处理包含多元素复合型数据(如数组、JSONB 键值对以及全文检索分词向量)的倒排索引结构。倒排索引为每个单独的内部元素条目维护一个指针列表,能够极其高效地处理测试特定元素是否存在或包含的集合查询:
<@ @> = &&
详见 Section 65.4。
块范围索引(Block Range Indexes,简称 BRIN)在底层仅存储数据表中连续物理数据块范围(Block Ranges)的摘要元数据信息(通常是每个数据块区间的最小值与最大值)。因此,BRIN 索引占用的磁盘物理空间极小(通常只有普通 B 树的百分之一),对于那些物理存储顺序与列取值天然高度正相关的海量数据表(例如按递增时间顺序写入的日志流或自增订单表)加速效果极为卓越。详见 Section 65.5。