Вопрос на частичных ключах и индекс на таблице базы данных
-
30-09-2019 - |
Вопрос
Предположим, у меня есть два запроса на таблице базы данных.
Запросы определяются в терминах полей, используемых в запросе:
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}
У меня есть два вопроса:
Является ли мое предположение правильно? То есть я могу просто определить один индекс (the_idx) вместо предыдущих двух?
Удерживает ли это поведение индекса для PostgreSQL Query?
Решение
Является ли мое предположение правильно? То есть я могу просто определить один индекс (the_idx) вместо предыдущих двух?
да.
Это называется индексом покрытия, и вы хотите заказать столбцы, основанные на которых, скорее всего, будут использоваться запросы. IE: если F2 является наиболее распространенным столбцом, вы хотите использовать:
CREATE INDEX the_idx {f2, f1, f3, f4}
Удерживает ли это поведение индекса для PostgreSQL Query?
Нет, Postgres не поддерживает индексы покрытия.
Индексы не являются стандартом ANSI; Это чудо, что терминология настолько последовательна между поставщиками, как и оно.
Другие советы
В целом более заселенный индекс будет использоваться. Однако чем больше вы добавляете в этот индекс, тем больше потребуется над головой.
Лучше всего попробовать, и посмотрите на план исполнения, чтобы увидеть, используется ли он таким образом, чтобы вы ожидаете.
В зависимости от фактических столбцов, возвращаемых в наборе результатов, может быть более полезным использовать более короткий индекс.
То Mysql Manual. Делает это достаточно ясно, что да, любой «префикс» ключа можно будет искать в любом не хэш-индексе (который является большинством из них).
Я не мог найти какую-либо сопоставимую документацию для PostgreSQL, но вы всегда можете создавать таблицу, а затем сделать объяснение (в любом случае неплохую идею).