Определение применения составного индекса без фильтра по первому полю

Индекс может использоваться и без фильтра по customer_id, но эффективность не гарантирована. Правило «нет первого поля — индекс никогда не работает» для PostgreSQL слишком категорично.

Короткий ответ

Что ответить на собеседовании

Индекс может использоваться и без фильтра по customer_id, но эффективность не гарантирована. Правило «нет первого поля — индекс никогда не работает» для PostgreSQL слишком категорично.

Подробный разбор

Ответ с пояснениями

Условие

В схеме базы данных существует таблица public.carts с составным индексом, охватывающим столбцы (customer_id, country, sku). Необходимо выяснить, будет ли планировщик запросов задействовать этот индекс, если в запросе отсутствует условие фильтрации по полю customer_id.

Условия задачи:

  • Составной индекс объявлен как (customer_id, country, sku).
  • В SQL‑запросе нет условия WHERE customer_id = ….

Структура таблиц:

Table "public.carts"
+-------------+-----------------------------+-------------------------+
| Column      | Type                        | Modifiers               |
+-------------+-----------------------------+-------------------------+
| sku         | bigint                      | not null                |
| country     | country_enum                | not null                |
| customer_id | bigint                      | not null                |
| amount      | bigint                      | not null                |
| updated_at  | timestamp without time zone | default now() not null |
+-------------+-----------------------------+-------------------------+

Table "public.customer"
+--------+--------+----------+
| Column | Type   | Modifiers |
+--------+--------+----------+
| id     | bigint | not null |
| email  | text   | not null |
+--------+--------+----------+

Ответ

Индекс может использоваться и без фильтра по customer_id, но эффективность не гарантирована. Правило «нет первого поля — индекс никогда не работает» для PostgreSQL слишком категорично.

Для B-tree ограничение по ведущему полю обычно лучше сокращает область сканирования. Возможен проход по индексу, в том числе для покрытия данных; в PostgreSQL 18 есть skip scan, особенно полезный при небольшом числе разных значений пропущенного ведущего столбца. Решение зависит от полной формы запроса, статистики и версии. Смотрите EXPLAIN (ANALYZE, BUFFERS), а для регулярного поиска по country/sku оцените соответствующий отдельный индекс.

Источник: www.postgresql.org.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее