Индекс нескольких столбцов против индекса по массиву - PullRequest
0 голосов
/ 17 октября 2018

Я новичок в базах данных и пытаюсь изучить PostgreSQL.Мой вопрос:

Есть ли разница между

CREATE INDEX the_index ON the_table (column1, column2);

и

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

?

1 Ответ

0 голосов
/ 18 октября 2018

Поскольку вы говорите об индексах 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 является довольно надуманным, я бы сказал, чтотакой индекс не имеет большого смысла в большинстве случаев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...