Задать вопрос
@Mimuss

Составной индекс и селективность его столбцов?

Составной индекс b типа сравнивается кортежами, то бишь порядок определения индекса имеет значение - (a,b) и (b,a) не равнозначны. Допустим, имеется два столбца в некоторой абстрактной таблице: x - внешний ключ, y - datetime, соответственно x имеет более низкую селективность, чем y
Знаю и понимаю, что лучше определять b индекс для столбцов с высокой селективностью, то есть порядок будет таков - (y,x).
Я прав?
  • Вопрос задан
  • 1331 просмотр
Подписаться 1 Простой Комментировать
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
Составной индекс b типа сравнивается кортежами, то бишь порядок определения индекса имеет значение

Зависит от алгоритма. Справедливо для btree, может быть полностью лишено смысла для других типов. Например, если СУБД будет строить ключ для hash-индекса от конкатенации полей индекса - (a,b) ничем не будет отличаться от (b,a).

лучше определять b индекс для столбцов с высокой селективностью

Не имеет важного значения.
Значение имеет под какие запросы индексы делаем. btree (a,b) не может нормально обслуживать where b = value and a > value, для этого запроса куда осмысленнее (b,a)
Если у вас запрос where a = const and b = const, то btree индексы (a,b) и (b,a) будут равнозначны.

Если у вас индекс с крайне селективным timestamp на первом месте - то что вы с ним делать-то будете? Строгое сравнение таймштампа случай крайне редкий, а на любой запрос диапазона эффективность последующих полей падает катастрофично и большинство СУБД их вовсе не используют. В основном используют только если получается взять индекс как покрывающий.

имеется два столбца в некоторой абстрактной таблице: x - внешний ключ, y - datetime

Варианты если вы попробуете сделать только btree(y,x) индекс:
- СУБД вовсе откажется делать FK т.к. нет подходящего индекса для проверки FK
- СУБД неявно этот индекс создаст при добавлении FK
- СУБД позволит существовать FK без индекса, но соответственно fullscan всей таблицы на каждую проверку консистентности по этому FK (возможно по отдельному сканированию на каждую строку, которая вызвала проверку целостности ключа)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
c3gdlk
@c3gdlk
Ментор в http://rubyboost.ru/
В общем случае - да, такой индекс будет быстрее работать и быстрее перестраиваться.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы