Совет дня №4
Предположим, в запросе условие по двум полям:
select * from items where foo = 1 and bar = 2
Разработчик знает про индексы и добавляет их два: один на foo, второй на
bar. Логика такая: с одним индексом быстро, с двумя – еще быстрее.
Ан нет: не все так просто. Как правило, Postgres использует только один индекс
при обходе, потому что так быстрее. В этом легко убедиться, посмотрев план: там
будет индекс либо на foo, либо на bar, но не оба одновременно.
Конечно, бывает, что используются оба индекса. Это возможно, если условия
связаны через OR и Postgres выбрал bitmap index scan, используются подзапросы,
джоины. Но конкретно в нашем случае индекс будет один.
Если условия соединяются через AND, задайте составной индекс на пару (foo,
bar). Он будет быстрее, чем то и другое поле по отдельности.
Порядок полей в составном индексе важен. Желательно располагать их по нарастанию
множественности, а кроме того, иметь в виду следующее. Составной индекс может
быть использован, если известны его лидирующие компоненты. Например, (foo,
bar) сработает, если условие только на foo. По аналогии, индекс (foo, bar,
baz) сработает, если заданы foo и bar. Однако для bar и baz он не
подхватится.
Планируйте составной индекс так, чтобы охватить как можно больше случаев.
Нашли ошибку? Выделите мышкой и нажмите Ctrl/⌘+Enter