Поскольку вы говорите об индексах B-tree , второй индекс даже не будет работать в PostgreSQL.Это связано с тем, что индекс B-дерева можно определить только для данных, которые имеют линейное упорядочение .
. Вы можете представить индекс в виде отсортированного списка записей, указывающих на таблицу.В случае многостолбцового индекса записи будут отсортированы в лексикографическом стиле: сначала согласно 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
является довольно надуманным, я бы сказал, чтотакой индекс не имеет большого смысла в большинстве случаев.