Skip to content

11.2 索引类型#

11.2.1 B 树
11.2.2 哈希
11.2.3 GiST
11.2.4 SP-GiST
11.2.5 GIN
11.2.6 BRIN

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

CREATE INDEX name ON table USING HASH (column);

11.2.1 B 树#

B 树可以处理可排序成某种顺序的数据上的相等性和范围查询。尤其是,PostgreSQL查询计划程序会在索引列使用以下运算符之一进行比较时考虑使用 B 树索引

<   <=   =   >=   >

等效于这些运算符组合的结构(例如BETWEENIN)也可以通过 B 树索引搜索来实现。此外,索引列上的IS NULLIS NOT NULL条件可与 B 树索引配合使用。

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

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

11.2.2. 哈希#

哈希索引存储从索引列的值派生的 32 位哈希代码。因此,此类索引只能处理简单的相等比较。只要索引列参与使用相等运算符的比较,查询计划程序就会考虑使用哈希索引

=

11.2.3. GiST#

GiST 索引不是单一类型的索引,而是在其中可以实现许多不同索引策略的基础架构。因此,GiST 索引可与之一起使用的特定运算符会根据索引策略(运算符类)而异。例如,PostgreSQL的标准发行版包括用于多个二维几何数据类型的 GiST 运算符类,这些运算符类支持使用这些运算符进行索引查询

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

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

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

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

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

11.2.4. SP-GiST#

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

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

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

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

11.2.5. GIN#

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

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

<@   @>   =   &&

(有关这些操作符的含义,请参见第 9.19 节。)标准发行版中包含的 GIN 操作符类在表 70.1中进行了说明。许多其他 GIN 操作符类可在contrib集合或作为单独项目获得。有关更多信息,请参阅第 70 章

11.2.6. BRIN#

BRIN 索引(块范围索引的缩写)存储有关存储在表连续物理块范围中的值的摘要。因此,它们最适用于其值与表行的物理顺序密切相关的列。与 GiST、SP-GiST 和 GIN 一样,BRIN 可以支持许多不同的索引策略,并且 BRIN 索引可以使用的特定操作符根据索引策略而异。对于具有线性排序顺序的数据类型,索引数据对应于每个块范围中列中的值的最小值和最大值。这支持使用这些操作符进行索引查询

<   <=   =   >=   >

标准发行版中包含的 BRIN 操作符类在表 71.1中进行了说明。有关更多信息,请参阅第 71 章