Индекс может использоваться и без фильтра по 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.