==============  索引类型 ============== .. container:: sect1 :name: INDEXES-TYPES .. container:: titlepage .. container:: .. container:: .. rubric:: 11.2. 索引类型 :name: 索引类型 :class: title PostgreSQL提供了多种索引类型: B-tree、Hash、GiST、SP-GiST 、GIN 和 BRIN。每一种索引类型使用了 一种不同的算法来适应不同类型的查询。默认情况下, ``CREATE INDEX``\ 命令创建适合于大部分情况的B-tree 索引。 B-tree可以在可排序数据上的处理等值和范围查询。特别地,PostgreSQL的查询规划器会在任何一种涉及到以下操作符的已索引列上考虑使用B-tree索引: +--------+ | ``<`` | +--------+ | ``<=`` | +--------+ | ``=`` | +--------+ | ``>=`` | +--------+ | ``>`` | +--------+ 将这些操作符组合起来,例如\ ``BETWEEN``\ 和\ ``IN``\ ,也可以用B-tree索引搜索实现。同样,在索引列上的\ ``IS NULL``\ 或\ ``IS NOT NULL``\ 条件也可以在B-tree索引中使用。 优化器也会将B-tree索引用于涉及到模式匹配操作符\ ``LIKE``\ 和\ ``~`` 的查询,前提是\ *如果*\ 模式是一个常量且被固定在字符串的开头—例如:\ ``col LIKE 'foo%'``\ 或者\ ``col ~ '^foo'``, 但在\ ``col LIKE '%bar'``\ 上则不会。但是,如果我们的数据库没有使用C区域设置,我们需要创建一个具有特殊操作符类的索引来支持模式匹配查询,参见下面的\ `第 11.10 节 `__\ 。同样可以将B-tree索引用于\ ``ILIKE``\ 和\ ``~*``\ ,但仅当模式以非字母字符开始,即不受大小写转换影响的字符。 B-tree索引也可以用于检索排序数据。这并不会总是比简单扫描和排序更快,但是总是有用的。 Hash索引只能处理简单等值比较。不论何时当一个索引列涉及到一个使用了\ ``=``\ 操作符的比较时,查询规划器将考虑使用一个Hash索引。下面的命令将创建一个Hash索引: .. code:: synopsis CREATE INDEX name ON table USING HASH (column); GiST索引并不是一种单独的索引,而是可以用于实现很多不同索引策略的基础设施。相应地,可以使用一个GiST索引的特定操作符根据索引策略(\ *操作符类*\ )而变化。作为一个例子,PostgreSQL的标准捐献包中包括了用于多种二维几何数据类型的GiST操作符类,它用来支持使用下列操作符的索引化查询: +---------+ | ``<<`` | +---------+ | ``&<`` | +---------+ | ``&>`` | +---------+ | ``>>`` | +---------+ | ``<<|`` | +---------+ | ``&<|`` | +---------+ | ``|&>`` | +---------+ | ``|>>`` | +---------+ | ``@>`` | +---------+ | ``<@`` | +---------+ | ``~=`` | +---------+ | ``&&`` | +---------+ (这些操作符的含义见\ `第 9.11 节 `__\ )\ `表 64.1 `__\ 中给出了标准发布中所包括的 GiST 操作符类。 GiST索引也有能力优化“最近邻”搜索,例如: .. code:: programlisting SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10; 它将找到离给定目标点最近的10个位置。能够支持这种查询的能力同样取决于被使用的特定操作符类。 在\ `表 64.1 `__\ 中,“Ordering Operators”列中列出了可以在这种方法中使用的操作符。 和GiST相似,SP-GiST索引为支持多种搜索提供了一种基础结构。SP-GiST 允许实现众多不同的非平衡的基于磁盘的数据结构,例如四叉树、k-d树和radix树。作为一个例 子,PostgreSQL的标准捐献包中包含了一个用于二维点的SP-GiST操作符类,它用于支持使用下列操作符的索引化查询: +--------+ | ``<<`` | +--------+ | ``>>`` | +--------+ | ``~=`` | +--------+ | ``<@`` | +--------+ | ``<^`` | +--------+ | ``>^`` | +--------+ (其含义见\ `第 9.11 节 `__\ )\ `表 65.1 `__\ 中给出了标准发布中所包括的 SP-GiST 操作符类。 就像 GiST, SP-GiST 支持 “nearest-neighbor” 搜索. 对于支持距离排序的 SP-GiST 运算符类别,相应的运算符被规定在\ `表 65.1 `__\ 里面的“Ordering Operators”列中。 GIN 索引是“倒排索引”,它适合于包含多个组成值的数据值,例如数组。倒排索引中为每一个组成值都包含一个单独的项,它可以高效地处理测试指定组成值是否存在的查询。 与 GiST 和 SP-GiST相似, GIN 可以支持多种不同的用户定义的索引策略,并且可以与一个 GIN 索引配合使用的特定操作符取决于索引策略。作为一个例子,PostgreSQL的标准贡献包中包含了用于数组的GIN操作符类,它用于支持使用下列操作符的索引化查询: +--------+ | ``<@`` | +--------+ | ``@>`` | +--------+ | ``=`` | +--------+ | ``&&`` | +--------+ (这些操作符的含义见\ `第 9.18 节 `__\ )\ `表 66.1 `__\ 中给出了标准发布中所包括的 GIN 操作符类。在\ ``contrib``\ 集合中还有更多其他GIN操作符类。 BRIN 索引(块范围索引的缩写)存储有关存放在一个表的连续物理块范围上的值摘要信息。与 GiST、SP-GiST 和 GIN 相似,BRIN 可以支持很多种不同的索引策略,并且可以与一个 BRIN 索引配合使用的特定操作符取决于索引策略。对于具有线性排序顺序的数据类型,被索引的数据对应于每个块范围的列中值的最小值和最大值,使用这些操作符来支持用到索引的查询: +--------+ | ``<`` | +--------+ | ``<=`` | +--------+ | ``=`` | +--------+ | ``>=`` | +--------+ | ``>`` | +--------+ 包括在标准发布中的 BRIN 操作符类的文档在\ `表 67.1 `__\ 中。