Вопрос по частичным ключам и индексу по таблице базы данных - PullRequest
1 голос
/ 26 июня 2010

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

Запросы определяются в терминах полей, используемых в запросе:

Запрос1: зависит от f1, f2 и f3

Запрос2: зависит от f1, f2, f3 и f4

Я помню, как где-то читал, что механизм SQL-запросов (в данном случае mySQL) анализирует дерево индексов, начиная с самых левых полей в индексе.

Если это правильно, то я предполагаю, что вместо двух индексов, определенных в таблице, как это:

Index 1 (for Query1) : CREATE INDEX idx_1 {f1, f2, f3}
Index 2 (for Query2) : CREATE INDEX idx_2 {f1, f2, f3, f4}

Я могу просто определить один индекс, который содержит объединение ключей, используемых в обоих запросах, т.е.

Мне нужно только определить этот индекс:

(for BOTH Query1) : CREATE INDEX the_idx {f1, f2, f3, f4}

У меня два вопроса:

  1. Правильно ли мое предположение ?. т.е. я могу просто определить один индекс (the_idx) вместо двух предыдущих?

  2. Применимо ли это поведение индекса для механизма запросов PostgreSQL?

Ответы [ 3 ]

1 голос
/ 26 июня 2010

Правильно ли мое предположение ?. т.е. я могу просто определить один индекс (the_idx) вместо двух предыдущих?

Да.
Он называется индексом покрытия, и вы хотите упорядочить столбцы, по которым, вероятнее всего, будут использоваться запросы. IE: если f2 является наиболее распространенным столбцом, вы хотите использовать:

CREATE INDEX the_idx {f2, f1, f3, f4}

Это поведение индекса верно и для механизма запросов PostgreSQL?

Нет, Postgres не поддерживает индексы покрытия .

Индексы не являются стандартом ANSI; чудо, что терминология так непротиворечива между поставщиками, как она есть.

0 голосов
/ 26 июня 2010

В руководстве MySQL достаточно ясно сказано, что да, любой «префикс» ключа можно искать в любом нехэш-индексе (который является большинством из них).

Я не смог найти сопоставимой документации для PostgreSQL, но вы всегда можете создать таблицу и затем сделать EXPLAIN (в любом случае, неплохая идея).

0 голосов
/ 26 июня 2010

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

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

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

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