Создание многоколоночных индексов в PostgreSQL - PullRequest
0 голосов
/ 24 апреля 2020

Я сейчас занимаюсь созданием индексов для наших таблиц.

Я узнал о многоколоночных индексах, но не уверен в их влиянии. Пример:

У нас есть SQL для findById, findByIdAndStatus, findByResult.

. Это говорит о том, что наиболее часто используемые WHERE должны быть перечислены первыми в списке столбцов. Но мне было интересно, окажет ли это огромное влияние, если я создам индекс для различных комбинаций, где предложения.

This: (создание одного индекса для всех)

CREATE INDEX CONCURRENTLY ON Students (id, status, result)

против

Это: (создание разных индексов для разных запросов)

CREATE INDEX CONCURRENTLY ON Students (id)

CREATE INDEX CONCURRENTLY ON Students (id, status)

CREATE INDEX CONCURRENTLY ON Students (result)

Заранее большое спасибо!

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Практическое правило, которое вы прочитали, неверно.
Лучшее правило: создавайте такой индекс только в том случае, если он полезен и используется достаточно часто, чтобы оправдать снижение производительности при модификации данных, которое идет с каждым индексом.

Многостолбцовый индекс B-дерева на (a, b, c) полезен в нескольких случаях:

  1. , если запрос выглядит так:

    SELECT ... FROM tab
    WHERE a = $1 AND b = $2 AND c <operator> $3
    

    , где <operator> - оператор, поддерживаемый индексом, а $1, $2 и $3 - константы.

  2. , если запрос выглядит следующим образом:

    SELECT ... FROM tab
    WHERE a = $1 AND b = $2
    ORDER BY c;
    

    или как этот

    SELECT ... FROM tab
    WHERE a = $1
    ORDER BY b, c;
    

    Любые украшения в предложении ORDER BY должны быть отражены в выражении CREATE INDEX. Например, для ORDER BY b, c DESC индекс должен быть создан на (a, b, c DESC) или (a, b DESC, c) (индексы можно читать в обоих направлениях).

  3. , если запрос выглядит следующим образом:

    SELECT c
    FROM tab
    WHERE a = $1 AND b <operator> $2;
    

    Если таблица только что обновлена ​​VACUUM, это может дать вам сканирование только для индекса , поскольку вся необходимая информация находится в индексе.

    В последнее время PostgreSQL версий, такой индекс лучше создается как

    CREATE INDEX ON tab (a, b) INCLUDE (c);
    
1 голос
/ 24 апреля 2020

Создание одного индекса для всех и создание разных индексов будет иметь совершенно разное влияние на запросы.

  1. Вы можете использовать EXPLAIN, чтобы увидеть, используются ли индексы для запросов.

  2. Это видео действительно хорошо знать об индексах БД.

  3. Индекс СОЗДАТЬ ИНДЕКС ВРЕМЯ ВКЛЮЧЕНО Учащиеся (идентификатор, статус, результат) будут использоваться только и только если запрос использует идентификатор, (идентификатор, статус) или (идентификатор) , статус и результат) в предложении WHERE. запрос со статусом Где не будет использовать этот индекс вообще.

Индексы - это в основном сбалансированные двоичные деревья. Индекс из нескольких столбцов будет индексировать строки по идентификатору, затем строки, упорядоченные по идентификаторам, будут далее индексами по статусу, а затем с результатом и так далее. Вы можете видеть, что в этом индексе упорядочение по статусу отсутствует вообще. Он доступен только для строк, проиндексированных по первому идентификатору.

Посмотрите видео, все это довольно хорошо объясняется.

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