Составные индексы в 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
Источник::
Автор::
Создана::