我是数据库的新手,正在尝试学习PostgreSQL。我的问题是:
之间有区别吗
CREATE INDEX the_index ON the_table (column1, column2);
和
CREATE INDEX the_index ON the_table (ARRAY[column1, column2]);
?
答案 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
子句非常人为,我想说这样的索引在大多数情况下没有多大意义。