选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.3 已于 2018 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

11.2. 索引类型 #

PostgreSQL提供了多种索引类型:B-树、Hash、GiST、SP-GiST 和 GIN。每种索引类型都采用不同的算法,分别最适合不同类型的查询。默认情况下,CREATE INDEX命令创建的是 B-树索引,它适用于最常见的场景。

B-树能够处理可以按某种顺序排序的数据上的等值查询和范围查询。特别是,只要已索引列参与了下列任一操作符的比较,PostgreSQL查询规划器就会考虑使用 B-树索引:

<
<=
=
>=
>

与这些操作符组合等价的构造,例如BETWEENIN,也可以通过 B-树索引搜索来实现。此外,索引列上的IS NULLIS NOT NULL条件也可以配合 B-树索引使用。

如果模式是常量,并且锚定在字符串起始位置,优化器也可以对涉及模式匹配操作符LIKE~的查询使用 B-树索引,例如col LIKE 'foo%'col ~ '^foo',但不能用于col LIKE '%bar'。不过,如果你的数据库没有使用 C 区域设置,就需要以一个特殊操作符类来创建该索引,才能支持模式匹配查询的索引化,详见下文第 11.9 节。B-树索引也可以用于ILIKE~*,但前提是模式以非字母字符开头,也就是不会受到大小写转换影响的字符。

B-树索引还可以用于按排序顺序取回数据。这并不总是比简单扫描再排序更快,但通常会很有帮助。

Hash 索引只能处理简单的等值比较。只要已索引列参与的是使用=操作符的比较,查询规划器就会考虑使用 Hash 索引。使用以下命令创建 Hash 索引:

CREATE INDEX name ON table USING hash (column);

小心

哈希索引操作目前不会写入 WAL 日志,因此如果发生过未写入的更改,数据库崩溃后可能需要用REINDEX重建哈希索引。此外,在初始基础备份之后,哈希索引的更改不会通过流复制或基于文件的复制进行复制,因此它们会对随后使用它们的查询给出错误的答案。由于这些原因,目前不建议使用哈希索引。

GiST 索引并不是某一种单独的索引,而是一种基础设施,可在其中实现许多不同的索引策略。因此,GiST 索引可使用哪些具体操作符,取决于所采用的索引策略(即操作符类)。例如,PostgreSQL标准发布版中包含了若干二维几何数据类型的 GiST 操作符类,它们支持使用下列操作符的索引化查询:

<<
&<
&>
>>
<<|
&<|
|&>
|>>
@>
<@
~=
&&

(这些操作符的含义见第 9.11 节。)还有许多其他 GiST 操作符类可在contrib集合或作为独立项目获得。更多信息见第 55 章

GiST 索引还能够优化最近邻搜索,例如:

SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;

这会找出距离给定目标点最近的十个地点。能否做到这一点同样取决于所使用的具体操作符类。

与 GiST 一样,SP-GiST 索引也提供一种支持多种搜索的基础设施。SP-GiST 允许实现大量不同的、非平衡的、基于磁盘的数据结构,例如四叉树、k-d 树和基数树(trie)。例如,PostgreSQL标准发布版中包含了用于二维点的 SP-GiST 操作符类,它支持使用下列操作符的索引化查询:

<<
>>
~=
<@
<^
>^

(这些操作符的含义见第 9.11 节。)更多信息见第 56 章

GIN 索引是倒排索引,可以处理包含多个键的值,例如数组。与 GiST 和 SP-GiST 一样,GIN 也能支持多种不同的用户定义索引策略,GIN 索引可使用哪些具体操作符同样取决于索引策略。例如,PostgreSQL标准发布版中包含用于一维数组的 GIN 操作符类,它们支持使用下列操作符的索引化查询:

<@
@>
=
&&

(这些操作符的含义见第 9.18 节。) 还有许多其他 GIN 操作符类可在contrib集合或作为独立项目获得。更多信息见第 57 章

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。