多列索引与数组上的索引

时间:2018-10-17 15:24:19

标签: postgresql indexing

我是数据库的新手,正在尝试学习PostgreSQL。我的问题是:

之间有区别吗
CREATE INDEX the_index ON the_table (column1, column2);

CREATE INDEX the_index ON the_table (ARRAY[column1, column2]);

1 个答案:

答案 0 :(得分:0)

由于您在这里谈论B-tree索引,因此第二个索引甚至无法在PostgreSQL中使用。这是因为B树索引只能在具有linear ordering的数据上定义。

您可以将索引想象为指向该表的条目的排序列表。 对于多列索引,将以lexicographical的方式对条目进行排序:首先,根据column1,然后–在每个相等的column1组中–根据column2

索引可用于索引中扫描的索引条目彼此相邻的所有查询:

... WHERE column1 = 'text' AND column2 = 42
... WHERE column1 < 'text'
... WHERE column1 = 'text' AND column1 > 42

索引不能用于扫描索引条目彼此不相邻的查询:

... WHERE upper(column1) = 'TEXT'
... WHERE column2 = 42
... WHERE column1 || column2 = 'text42'

数组上的索引是完全不同的东西。对于这些,您将必须使用“ GIN”访问方法:

CREATE INDEX the_index ON the_table USING gin (ARRAY[column1, column2]);

(这假设两列都具有相同的数据类型。)

例如,这样的索引可用于使用数组运算符<@@>=&&来加快查询速度

... WHERE ARRAY[column1, column2] && ARRAY[1, 2, 3, 4, 5]

鉴于上面的WHERE子句非常人为,我想说这样的索引在大多数情况下没有多大意义。