11.2. 索引类型

163 阅读4分钟

11.2. 索引类型

PostgreSQL提供了几种索引类型:B-tree,Hash,GiST,SP-GiST,GIN,BRIN和扩展bloom。每种索引类型使用最适合不同类型的查询的不同算法。默认情况下,该命令创建适合最常见情况的 B 树索引。CREATE INDEX

B树可以处理对数据进行的相等和范围查询,这些数据可以按某种顺序排序。特别是,PostgreSQL 查询规划器将考虑在使用以下运算符之一的比较中涉及索引列时使用 B 树索引:

<
<=
=
>=
>

等效于这些运算符组合的构造,例如 和 ,也可以通过 B 树索引搜索来实现。此外,索引列上的 or 条件可以与 B 树索引一起使用。BETWEEN``IN``IS NULL``IS NOT NULL

优化器还可以将 B 树索引用于涉及模式匹配运算符的查询,以及模式是否为常量并且锚定到字符串的开头 — 例如,或 ,但不是 。但是,如果您的数据库不使用 C 语言环境,则需要使用特殊的运算符类创建索引,以支持模式匹配查询的索引;请参阅下文第 11.10 节。也可以对 和 使用 B 树索引,但前提是模式以非字母字符开头,即不受大写/小写转换影响的字符。LIKE``~``col LIKE 'foo%'``col ~ '^foo'``col LIKE '%bar'``ILIKE``~*

B 树索引也可用于按排序顺序检索数据。这并不总是比简单的扫描和排序更快,但它通常是有帮助的。

哈希索引只能处理简单的相等比较。每当使用运算符的比较中涉及索引列时,查询规划器将考虑使用哈希索引。以下命令用于创建哈希索引:=

CREATE INDEX name ON table USING HASH (column);

GiST 索引不是一种单一类型的索引,而是一个基础结构,可以在其中实现许多不同的索引策略。因此,可以使用 GiST 索引的特定运算符因索引策略(运算符类)而异。例如,PostgreSQL 的标准分布包括几种二维几何数据类型的 GiST 运算符类,这些运算符类支持使用以下运算符的索引查询:

<<
&<
&>
>>
`<<`
`&<`
`&>`
`>>`
@>
<@
~=
&&

(有关这些运算符的含义,请参见第 9.11 节。标准分布中包含的 GiST 运算符类记录在表 64.1 中。许多其他 GiST 运算符类在集合中可用或作为单独的项目提供。更多信息见第64章contrib

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

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

它找到最接近给定目标点的十个位置。执行此操作的能力再次取决于所使用的特定运算符类。在表 64.1 中,可以以这种方式使用的运算符列在“排序运算符”列中。

SP-GiST 索引与 GiST 索引一样,提供了支持各种搜索的基础结构。SP-GiST 允许实现各种不同的基于磁盘的非平衡数据结构,例如四叉树、k-d 树和基数树(tries)。例如,PostgreSQL 的标准发行版包括二维点的 SP-GiST 运算符类,它们支持使用以下运算符的索引查询:

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

(有关这些运算符的含义,请参见第 9.11 节。标准分布中包含的 SP-GiST 运算符类记录在表 65.1 中。更多信息见第65章

GIN 索引是“倒排索引”,适用于包含多个组件值(如数组)的数据值。倒排索引包含每个组件值的单独条目,并且可以有效地处理测试是否存在特定组件值的查询。

与 GiST 和 SP-GiST 一样,GIN 可以支持许多不同的用户定义的索引策略,并且可以使用 GIN 索引的特定运算符因索引策略而异。例如,PostgreSQL 的标准发行版包括一个用于数组的 GIN 运算符类,它支持使用以下运算符的索引查询:

<@
@>
=
&&

(有关这些运算符的含义,请参见第 9.18 节。标准分布中包含的 GIN 运算符类记录在表 66.1 中。许多其他 GIN 运算符类在集合中可用或作为单独的项目提供。更多信息见第66章contrib

BRIN 索引(块范围 INdexes 的简写)存储有关存储在表的连续物理块范围内的值的摘要。与GiST,SP-GiST和GIN一样,BRIN可以支持许多不同的索引策略,并且可以使用BRIN索引的特定运算符因索引策略而异。对于具有线性排序顺序的数据类型,索引数据对应于每个块范围的列中值的最小值和最大值。这支持使用以下运算符的索引查询:

<
<=
=
>=
>

标准分布中包含的 BRIN 运算符类记录在表 67.1 中。更多信息见第67章