PostgreSQL 提供了几种索引类型:B-tree、Hash、GiST、SP-GiST、GIN、BRIN,以及扩展 bloom。每种索引类型都使用一种最适合不同类型索引子句的算法。默认情况下,CREATE INDEX
命令创建 B-tree 索引,这适用于最常见的情况。其他索引类型通过写入关键字 USING
后跟索引类型名称来选择。例如,创建一个 Hash 索引
CREATE INDEXname
ONtable
USING HASH (column
);
B-tree 索引可以处理可排序数据的相等性和范围查询。特别是,当索引列涉及以下运算符之一的比较时,PostgreSQL 查询规划器会考虑使用 B-tree 索引:
< <= = >= >
等同于这些运算符组合的构造,例如 BETWEEN
和 IN
,也可以使用 B-tree 索引搜索来实现。此外,索引列上的 IS NULL
或 IS NOT NULL
条件也可以与 B-tree 索引一起使用。
如果模式是常量并且锚定在字符串的开头(例如,col LIKE 'foo%'
或 col ~ '^foo'
,而不是 col LIKE '%bar'
),则优化器还可以使用 B-tree 索引对涉及模式匹配运算符 LIKE
和 ~
的查询。然而,如果您的数据库不使用 C 区域设置,则需要使用特殊的运算符类创建索引来支持模式匹配查询的索引;请参阅下面的 第 11.10 节。对于 ILIKE
和 ~*
,也可以使用 B-tree 索引,但前提是模式以非字母字符开头,即不受大小写转换影响的字符。
B-tree 索引也可用于按排序顺序检索数据。这并不总是比简单的扫描和排序更快,但通常很有帮助。
GiST 索引本身并不是一种索引,而是一个基础设施,可以在其中实现许多不同的索引策略。因此,GiST 索引可以使用的特定运算符取决于索引策略(运算符类)。例如,PostgreSQL 的标准发行版包含适用于几种二维几何数据类型的 GiST 运算符类,这些类支持使用以下运算符的索引查询:
<< &< &> >> <<| &<| |&> |>> @> <@ ~= &&
(这些运算符的含义请参阅 第 9.11 节。) 标准发行版中包含的 GiST 运算符类在 表 65.1 中有记录。在 contrib
集合或作为独立项目中有许多其他 GiST 运算符类可用。有关更多信息,请参阅 第 65.2 节。
GiST 索引还能够优化“最近邻”搜索,例如:
SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;
该查询查找离给定目标点最近的十个地点。能够执行此操作的能力再次取决于所使用的特定运算符类。在 表 65.1 中,可以这样使用的运算符在“Ordering Operators”列中列出。
SP-GiST 索引,与 GiST 索引类似,提供了一个支持各种搜索类型的基础设施。SP-GiST 允许实现广泛的不同非平衡磁盘数据结构,例如四叉树、k-d 树和基数树(trie)。例如,PostgreSQL 的标准发行版包含适用于二维点的 SP-GiST 运算符类,这些类支持使用以下运算符的索引查询:
<< >> ~= <@ <<| |>>
(这些运算符的含义请参阅 第 9.11 节。) 标准发行版中包含的 SP-GiST 运算符类在 表 65.2 中有记录。有关更多信息,请参阅 第 65.3 节。
与 GiST 类似,SP-GiST 支持“最近邻”搜索。对于支持距离排序的 SP-GiST 运算符类,对应的运算符在 表 65.2 的“Ordering Operators”列中列出。
GIN 索引是“倒排索引”,适合包含多个组件值(如数组)的数据值。倒排索引为每个组件值包含一个单独的条目,并且可以有效地处理测试特定组件值是否存在的查询。
与 GiST 和 SP-GiST 类似,GIN 可以支持许多不同的用户定义的索引策略,并且 GIN 索引可以使用的特定运算符取决于索引策略。例如,PostgreSQL 的标准发行版包含一个适用于数组的 GIN 运算符类,该类支持使用以下运算符的索引查询:
<@ @> = &&
(这些运算符的含义请参阅 第 9.19 节。) 标准发行版中包含的 GIN 运算符类在 表 65.3 中有记录。在 contrib
集合或作为独立项目中有许多其他 GIN 运算符类可用。有关更多信息,请参阅 第 65.4 节。
如果您在文档中发现任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表格 报告文档问题。