Лучшие индексы для таблицы в Postgres - PullRequest
0 голосов
/ 28 февраля 2019

Допустим, у меня есть следующая таблица

CREATE TABLE tbl
(
  id uuid NOT NULL DEFAULT gen_random_uuid(),
  col_a uuid NOT NULL,
  col_b character varying NOT NULL,
  PRIMARY KEY (id)
);

И я бы хотел, чтобы она была уникальной над (col_a, col_b), поэтому я бы также создал следующий индекс

CREATE UNIQUE INDEX tbl_unique_idx ON tbl USING btree (col_a, col_b);

Пока все хорошо, мой вопрос, учитывая, что я хочу, чтобы следующие два запроса в полной мере использовали индексы, потребуются ли мне дополнительные индексы?

SELECT * FROM tbl WHERE col_a=$1 ORDER BY col_b;

SELECT * FROM tbl WHERE col_a=$1 AND col_b=$2;

По сути, мы всегда будем фильтровать по col_a, может Postgesиспользовать tbl_unique_idx здесь?Мы также всегда либо сортируем, либо фильтруем по col_b (в дополнение к фильтрации по col_a), поэтому может ли он использовать тот же индекс или потребовать свой собственный индекс?

Таблица может достигать многих миллионов записей, поэтому я 'м, чтобы не иметь избыточных индексов.В настоящее время я использую PostgreSQL 10, но могу получить обновление до 11, если есть явная выгода.

1 Ответ

0 голосов
/ 01 марта 2019

Индекс, который вы создали, будет идеально обслуживать ваши два запроса.Его нельзя улучшить.

Я бы создал уникальное ограничение , а не уникальный index .Таким образом, вы также можете использовать INSERT ... ON CONFLICT, если вам это нужно.

Возможно, вы не хотите, чтобы SELECT * в вашем коде.С одной стороны, это означает, что ваш код может сломаться, если вы добавите дополнительный столбец, но это также прирост производительности, если вы извлекаете только те столбцы, которые вам действительно нужны, особенно если некоторые данные находятся в таблице TOAST.

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