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