由于您在这里谈论的是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 子句相当做作,我想说这样的索引在大多数情况下没有多大意义。