11.2. 索引类型

LightDB提供了多种索引类型: B-tree、Hash、GiST、GIN。每一种索引类型使用了 一种不同的算法来适应不同类型的查询。默认情况下, CREATE INDEX 命令创建适合于大部分情况的B-tree 索引。 在索引类型名后面加上关键字USING , 可以选择其他的索引类型,例如, 创建一个HASH索引:

      CREATE INDEX name ON table USING HASH (column);
      

B树可以处理可以排序的数据上的等值和范围查询。特别是,在涉及使用以下运算符之一进行比较的索引列时,LightDB查询优化器将考虑使用B树索引:

<
<=
=
>=
>

这些运算符的组合等效结构,如BETWEENIN,也可以使用B树索引搜索实现。此外,对索引列的IS NULLIS NOT NULL条件可以与B树索引一起使用。

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

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

哈希索引只能处理简单的等值比较。查询优化器将在涉及使用=运算符进行比较的索引列时,考虑使用哈希索引。以下命令用于创建哈希索引:

CREATE INDEX name ON table USING HASH (column);

GiST索引不是单一类型的索引,而是一个基础设施,可以在其中实现许多不同的索引策略。因此,可以使用GiST索引的特定运算符取决于索引策略(运算符类)。例如,LightDB的标准分发版包括用于几种二维几何数据类型的GiST运算符类,这些运算符支持使用以下运算符进行索引查询:

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

(有关这些运算符的含义,请参见Section 9.11。) 标准分发版中包含的GiST运算符类在Table 59.1中有文档记录。 许多其他GiST运算符类可在contrib集合或作为单独的项目中使用。 有关更多信息,请参见Chapter 59

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

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

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

GIN索引是逆向索引,适用于包含多个组件值的数据值,例如数组。逆向索引包含每个组件值的单独条目,并且可以高效地处理测试特定组件值存在性的查询。

与GiST类似,GIN可以支持许多不同的用户定义索引策略,可以使用GIN索引的特定运算符取决于索引策略。例如,LightDB的标准分发版包括用于数组的GIN运算符类,这些运算符支持使用以下运算符进行索引查询:

<@
@>
=
&&

(有关这些运算符的含义,请参见Section 9.19。) 标准分发版中包含的GIN运算符类在Table 60.1中有文档记录。 许多其他GIN运算符类可在contrib集合或作为单独的项目中使用。有关更多信息,请参见Chapter 60