Индекс может быть определен для нескольких столбцов таблицы. Например, если имеется таблица следующего вида:
CREATE TABLE test2 ( major int, minor int, name varchar );
(допустим, вы храните содержимое своего /dev
каталога в базе данных...) и часто выполняете запросы вида:
SELECT name FROM test2 WHERE major =константаAND minor =константа;
то целесообразно определить индекс для столбцов
major и
minor совместно, например:
CREATE INDEX test2_mm_idx ON test2 (major, minor);
В настоящее время только типы индекса B-дерево, GiST, GIN и BRIN поддерживают индексы с несколькими ключевыми столбцами. Возможность использования нескольких ключевых столбцов не зависит от того, INCLUDE можно ли добавить в индекс неключевые
столбцы. Индексы могут содержать до 32 столбцов,
включая INCLUDE столбцы. (Этот лимит может быть
изменен при сборке Digital Q.DataBase; см.
файл pg_config_manual.h.)
Многостолбцовый индекс B-дерево может использоваться с условиями запроса, затрагивающими любое подмножество столбцов индекса, однако индекс наиболее эффективен при наличии ограничений на ведущие (крайние левые) столбцы. Точное правило заключается в том, что для ограничения сканируемой части индекса будут использоваться ограничения равенства для ведущих столбцов, а также любые ограничения неравенства для первого столбца, не имеющего ограничения равенства. Ограничения на столбцы, расположенные справа от этих столбцов, проверяются в индексе, что позволяет избежать лишних обращений к самой таблице, но не уменьшает объем сканируемой части индекса. Например, если имеется индекс по (a, b, c) и условие
запроса WHERE a = 5 AND b >= 42 AND c < 77,
индекс необходимо будет сканировать, начиная с первой записи с
a = 5 и b = 42 вплоть до последней записи с
a = 5. Записи индекса с c >= 77 будут
пропущены, однако их все равно придется просмотреть.
Данный индекс в принципе может быть использован для запросов, содержащих ограничения
на b и/или c при отсутствии ограничений на a
— но в этом случае придется сканировать весь индекс целиком, поэтому чаще всего планировщик запросов предпочтет последовательное сканирование таблицы использованию индекса.
Многоколончатый индекс GiST может применяться в запросах, условия которых включают любое подмножество столбцов этого индекса. Условия на дополнительные столбцы ограничивают количество записей, возвращаемых индексом, однако условие на первый столбец является определяющим фактором для объема сканирования индекса. Индекс GiST будет относительно неэффективным, если его первый столбец содержит лишь небольшое количество уникальных значений, даже если в дополнительных столбцах представлено много уникальных значений.
Многоколоночный индекс GIN может использоваться в условиях запроса, затрагивающих любое подмножество столбцов этого индекса. В отличие от B-дерева или GiST, эффективность поиска по индексу не зависит от того, какие именно столбцы индекса используются в условиях запроса.
Многоколоночный индекс BRIN может использоваться в условиях запроса, затрагивающих любое подмножество столбцов этого индекса. Как и в GIN, и в отличие от B-дерева или GiST, эффективность поиска по индексу не зависит от того, какие столбцы индекса задействованы в условиях запроса. Единственной причиной для создания нескольких индексов BRIN вместо одного составного индекса BRIN для одной таблицы является необходимость использования различных pages_per_range параметров хранения.
Разумеется, каждый столбец должен использоваться с операторами, соответствующими типу индекса; предложения, содержащие другие операторы, рассматриваться не будут.
Многостолбцовые индексы следует использовать с осторожностью. В большинстве ситуаций индекса по одному столбцу достаточно для экономии места и времени. Индексы, содержащие более трех столбцов, вряд ли будут полезны, за исключением крайне специфических сценариев использования таблицы. См. также Раздел 2.8.5 и Раздел 2.8.9 для ознакомления с преимуществами различных конфигураций индексов.