9.3 9.4 9.5 9.6 10 11 12 13 14 15 16 17 Current(18)
PostgreSQL中文社区 问题报告 纠错本页面

11.2. 索引类型 #

11.2.1. B-Tree
11.2.2. Hash
11.2.3. GiST
11.2.4. SP-GiST
11.2.5. GIN
11.2.6. BRIN

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

CREATE INDEX name ON table USING HASH (column);

11.2.1. B-Tree #

B-tree可以处理可排序数据上的等值和范围查询。 特别地,PostgreSQL的查询规划器 会在任何一种涉及到以下操作符的已索引列上考虑使用B-tree索引:

<   <=   =   >=   >
   

将这些操作符组合起来,例如BETWEENIN,也可以用 B-tree索引搜索实现。同样,在索引列上的IS NULLIS NOT NULL条件也可以在B-tree索引中使用。

优化器也会将B-tree索引用于涉及到模式匹配操作符LIKE~的查询,前提是如果模式是一个常量且被固定在字符串的开头—例如:col LIKE 'foo%'或者col ~ '^foo',但在col LIKE '%bar'上则不会。然而,如果您的数据库没有 使用C区域设置,您需要创建一个具有特殊操作符类的索引来支持模式匹配查询;参见下面的第 11.10 节。同样可以将B-tree索引用于ILIKE~*,但仅当模式以非字母字符开始,即不受大小写转换影响的字符。

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

11.2.2. Hash #

Hash索引存储一个由索引列计算出的32位哈希值。因此,Hash索引只能处理简单等值比较。每当索引列涉及到等值操作符的比较时,查询规划器将会使用Hash索引。

=

11.2.3. GiST #

GiST索引并不是一种单独的索引,而是可以用于实现很多不同索引策略的基础设施。相应地,可以使用一个GiST索引的特定操作符根据索引策略(操作符类)而变化。作为一个例子,PostgreSQL的标准发行版中包括了用于多种二维几何数据类型的GiST操作符类,它用来支持使用下列操作符的索引化查询:

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

(这些操作符的含义见第 9.11 节表 65.1中给出了标准发布中所包括的GiST操作符类。contrib集合中还包括了很多其他GiST操作符类,可见第 65.2 节

GiST索引也有能力优化最近邻搜索,例如:

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

它将找到离给定目标点最近的10个位置。能够支持这种查询的能力同样取决于被使用的特定操作符类。 在表 65.1中,Ordering Operators列中列出了可以在这种方法中使用的操作符。

11.2.4. SP-GiST #

SP-GiST索引,像GiST索引一样,提供了一种支持多种搜索的基础结构。 SP-GiST允许实现众多不同的非平衡的基于磁盘的数据结构,例如四叉树、 k-d树和radix树(tries)。作为一个例子,PostgreSQL 的标准捐献包中包含了一个用于二维点的SP-GiST操作符类,它用于支持使用 下列操作符的索引化查询:

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

(其含义见第 9.11 节表 65.2 中给出了标准发布中所包括的SP-GiST操作符类。更多信息参见第 65.3 节

就像GiST一样,SP-GiST支持nearest-neighbor搜索。 对于支持距离排序的SP-GiST操作符类,相应的操作符被列在 Ordering Operators列中,位于表 65.2

11.2.5. GIN #

GIN索引是倒排索引,它适合于包含多个组成值的数据值,例如数组。 倒排索引中为每一个组成值都包含一个单独的项,它可以高效地处理测试指定 组成值是否存在的查询。

与 GiST 和 SP-GiST 相似,GIN 可以支持多种不同的用户定义的索引策略,并且可以与一个 GIN 索引配合使用的特定操作符取决于索引策略。作为一个例子,PostgreSQL的标准发行版中包含了用于数组的 GIN 操作符类,它用于支持使用下列操作符的索引化查询:

<@   @>   =   &&

(这些操作符的含义见 第 9.19 节。)表 65.3 中给出了标准发行版中所包括的 GIN 操作符类。在 contrib 集合中还有更多其他 GIN 操作符类,更多信息参见 第 65.4 节

11.2.6. BRIN #

BRIN 索引(块范围索引的缩写)存储有关存放在一个表的连续物理块范围上的值摘要信息。因此,那些值和表中物理行存放顺序相关性更好的列更高效。与 GiST、SP-GiST 和 GIN 相似,BRIN 可以支持多种不同的索引策略,并且可以与一个 BRIN 索引配合使用的特定操作符取决于索引策略。对于具有线性排序顺序的数据类型,被索引的数据对应于每个块范围的列中值的最小值和最大值,使用这些操作符来支持用到索引的查询:

<   <=   =   >=   >

标准发行版中有记录 BRIN 操作符类 表 65.4。更多信息请见 第 65.5 节