Postgresql 中文操作指南

11.2. Index Types #

PostgreSQL 提供了多种索引类型:B 树、哈希、GiST、SP-GiST、GIN、BRIN 以及扩展 bloom 。每种索引类型都使用不同的算法,该算法最适合不同类型的可索引子句。默认情况下, CREATE INDEX 命令创建 B 树索引,这适合最常见的情况。通过编写关键词 USING 后跟索引类型名称,可以选择其他索引类型。例如,创建哈希索引:

CREATE INDEX name ON table USING HASH (column);

11.2.1. B-Tree #

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

<   <=   =   >=   >

也可以用 B 树索引搜索来实现相当于这些运算符组合的构造,例如 BETWEENIN。而且,对索引列的 IS NULLIS NOT NULL 条件也可以与 B 树索引一起使用。

优化器还可以针对涉及模式匹配运算符 LIKE~ 的查询使用 B 树索引 if 模式是一个常量,并且锚定在字符串的开头——例如,col LIKE 'foo%'col ~ '^foo',但不是 col LIKE '%bar'。但是,如果你的数据库不使用 C 区域设置,则需要使用特殊运算符类创建索引以支持模式匹配查询的索引编制;请参阅下面的 Section 11.10。也可以对 ILIKE~* 使用 B 树索引,但仅当模式以非字母字符开头时,即不受大小写转换影响的字符。

B 树索引还可以用于以已排序顺序检索数据。这并不总是比简单的扫描和排序要快,但常常很有帮助。

11.2.2. Hash #

Hash 索引存储由索引列的值派生的 32 位哈希码。因此,此类索引只能处理简单的相等性比较。只要在使用相等运算符进行比较时,查询规划器便会考虑使用 Hash 索引,它涉及某个已编制索引的列:

=

11.2.3. GiST #

GiST 索引并非单一种类的索引,而是可以在其中实现许多不同索引策略的基础设施。因此,可以与 GiST 索引一起使用的特定运算符因索引策略(operator class)而异。例如,PostgreSQL 的标准发行版包括适用于多种二维几何数据类型的 GiST 运算符类,它们支持使用以下这些运算符的索引查询:

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

(有关这些运算符的含义,请参阅 Section 9.11。)标准发行版中包含的 GiST 运算符类记录在 Table 68.1 中。contrib 集合或其他项目中提供了许多其他 GiST 运算符类。有关详细信息,请参阅 Chapter 68

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

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

该命令可查找距离给定目标点最近的十个地点。执行此操作的能力再次取决于所使用的特定运算符类。在 Table 68.1 中,“顺序运算符”列中列出了可以用这种方式使用的运算符。

11.2.4. SP-GiST #

与 GiST 索引类似,SP-GiST 索引提供了一种支持多种搜索的基础设施。SP-GiST 允许实现广泛的不同非平衡基于磁盘的数据结构,如四叉树、kd 树和基数树(trie)。例如,PostgreSQL 的标准发行版包含适用于二维点的 SP-GiST 运算符类,它们支持使用以下这些运算符的索引查询:

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

(有关这些运算符的含义,请参阅 Section 9.11。)标准发行版中包含的 SP-GiST 运算符类记录在 Table 69.1 中。有关更多信息,请参阅 Chapter 69

与 GiST 一样,SP-GiST 也支持“最近邻”搜索。针对支持距离排序的 SP-GiST 运算符类,其相应运算符列在 Table 69.1 的“排序运算符”列中。

11.2.5. GIN #

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

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

<@   @>   =   &&

(有关这些运算符的含义,请参阅 Section 9.19。)标准发行版中包含的 GIN 运算符类记录在 Table 70.1 中。contrib 集合或其他项目中提供了许多其他 GIN 运算符类。有关详细信息,请参阅 Chapter 70

11.2.6. BRIN #

BRIN 索引(Block Range INdexes 的缩写)存储有关表连续物理块范围中存储的值的汇总。因此,它们最适用于值与表行物理顺序密切相关的列。与 GiST、SP-GiST 和 GIN 类似,BRIN 可以支持许多不同的索引策略,并且 BRIN 索引可以使用的特定运算符因索引策略不同而异。对于具有线性排序顺序的数据类型,索引数据对应于每个块范围中列中值的最小值和最大值。这支持使用以下运算符的索引查询:

<   <=   =   >=   >

标准发行版中包含的 BRIN 运算符类记录在 Table 71.1 中。有关更多信息,请参阅 Chapter 71