受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

11.2. 索引类型 #

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~的查询使用 B-树索引,例如col LIKE 'foo%'col ~ '^foo',但不能用于col LIKE '%bar'。不过,如果你的数据库没有使用 C 区域设置,就需要以一个特殊操作符类来创建该索引,才能支持模式匹配查询的索引化,详见下文Section 11.10。B-树索引也可以用于ILIKE~*,但前提是模式以非字母字符开头,也就是不会受到大小写转换影响的字符。

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

11.2.2. 哈希 #

哈希索引存储从索引列值派生出的 32 位哈希码。因此,这类索引只能处理简单的等值比较。只要已索引列参与的是使用等号操作符的比较,查询规划器就会考虑使用哈希索引:

=

11.2.3. GiST #

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

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

(这些操作符的含义见Section 9.11。)标准发布版自带的 GiST 操作符类记录在Table 63.1中。还有许多其他 GiST 操作符类可在contrib集合或独立项目中获得。更多信息见Chapter 63

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

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

这会找出距离给定目标点最近的十个地点。是否能做到这一点,同样取决于所使用的具体操作符类。在Table 63.1中,可以按这种方式使用的操作符列在Ordering Operators这一列中。

11.2.4. SP-GiST #

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

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

(这些操作符的含义见Section 9.11。)标准发布版自带的 SP-GiST 操作符类记录在Table 64.1中。更多信息见Chapter 64

与 GiST 一样,SP-GiST 支持最近邻搜索。对于支持距离排序的 SP-GiST 操作符类,相应操作符列在Table 64.1Ordering Operators列中。

11.2.5. GIN #

GIN 索引是倒排索引,适用于包含多个组成值的数据值,例如数组。倒排索引会为每个组成值保存单独的项,因此能够高效处理测试特定组成值是否存在的查询。

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

<@   @>   =   &&

(这些操作符的含义见Section 9.19。)标准发布版自带的 GIN 操作符类记录在Table 65.1中。还有许多其他 GIN 操作符类可在contrib集合或独立项目中获得。更多信息见Chapter 65

11.2.6. BRIN #

BRIN 索引(块范围索引,Block Range Indexes)存储的是关于表中连续物理块范围内所保存值的摘要信息。因此,它最适用于那些列值与表行物理顺序高度相关的列。与 GiST、SP-GiST 和 GIN 一样,BRIN 也可以支持多种不同的索引策略,而 BRIN 索引可使用哪些具体操作符取决于所采用的索引策略。对于具有线性排序顺序的数据类型,每个块范围上被索引的数据对应于该列值的最小值和最大值。这支持使用下列操作符的索引化查询:

<   <=   =   >=   >

标准发布版自带的 BRIN 操作符类记录在Table 66.1中。更多信息见Chapter 66

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。