Вопрос на частичных ключах и индекс на таблице базы данных

StackOverflow https://stackoverflow.com/questions/3124213

Вопрос

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

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

Query1: зависит от F1, F2 и F3

Query2: зависит от F1, F2, F3 и F4

Я помню, как читать где-то, что двигатель SQL Query (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 Query?

Это было полезно?

Решение

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

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

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

Удерживает ли это поведение индекса для PostgreSQL Query?

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

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top