Составные индексы в PostgreSQL позволяют ускорить выполнение запросов, в которых используются несколько колонок одновременно. Однако важно учитывать особенности их частичного использования.

При выполнении запроса составной индекс может использоваться до первого неравенства включительно. Это означает, что при встрече оператора неравенства (>, <, >=, <=) индекс перестает быть эффективным для последующих колонок.

Например, в запросе a = 0 AND b > 3 AND c > 5 индекс будет использоваться для колонок a и b, но не для c, так как оператор неравенства для b ограничивает дальнейшее использование индекса.

  • a > 0 AND b = 4: Индекс будет использоваться для всех колонок, несмотря на то, что первая часть — это неравенство.
  • a = 0 AND b > 3 AND c = 3: Индекс будет использоваться для первых двух колонок. После неравенства индекс уже не применяется.
  • a = 0 AND b > 3 AND c > 3: Индекс будет использоваться для первой и второй колонки.

Порядок колонок: равенство по всем колонкам vs частичный префикс

Если запрос задаёт равенство по всем колонкам индекса (a = ? AND b = ? AND c = ?), порядок колонок не влияет на стоимость поиска — B-tree находит запись за один спуск при любом порядке. Проверяется через EXPLAIN (ANALYZE, BUFFERS): одинаковый объём buffers для (a, b, c) и (c, b, a).

Порядок важен для запросов по частичному префиксу. Запрос WHERE c = ? (фильтр только по неведущей колонке) индекс (a, b, c) эффективно использовать не может — в PostgreSQL до 16 включительно нет index skip scan, поэтому идёт почти полный проход индекса. Индекс (c, ...) тот же запрос обслуживает точечно.

Практическое правило: ведущей делать самую селективную всегда присутствующую в фильтре колонку. Низкокардинальную (2–3 значения) ведущей ставить не стоит — для префиксных запросов она бесполезна, а на запрос с равенством по всем колонкам порядок и так не влияет.


Мета информация

Область:: 00 PostgreSQL
Родитель:: Составной индекс в БД, Индекс в PostgreSQL
Источник::
Автор::
Создана::

Дополнительные материалы

Дочерние заметки