intermediate
Index types
Выбирайте B-tree, GIN, GiST, BRIN, partial, expression и composite indexes по access path.
В PostgreSQL больше семейств индексов, чем B-tree по умолчанию. Выбирайте тип под предикат запроса, а не под имя колонки.
| Тип индекса | Типичное применение | |-------------|---------------------| | B-tree (default) | Равенство, диапазоны, ORDER BY по скалярам | | GIN | JSONB containment, массивы, полнотекст | | GiST | Геометрия, диапазоны, nearest-neighbor | | BRIN | Очень большие упорядоченные таблицы (time series) | | Hash | Legacy только равенство; редко лучше B-tree |
Частичные индексы снижают стоимость записи, когда запросы всегда фильтруют одинаково:
CREATE INDEX idx_orders_open ON orders (created_at)
WHERE status = 'open';
CREATE INDEX idx_users_email_lower ON users (lower(email));
Порядок колонок в составном индексе: сначала equality-фильтры, затем range/sort. Expression index нужен, когда в запросе к колонке применяется функция.
На интервью: назовите access path (равенство vs диапазон vs containment), объясните, почему GIN подходит для JSONB/@>, но не для каждой колонки, и упомяните стоимость индексов при записи.
Типовые ошибки: индекс на каждую колонку; GIN на низкокардинальные boolean; неверный порядок в composite; игнор partial indexes для «горячих» подмножеств.
Компромисс — скорость чтения против усиления записи, объёма хранения и сюрпризов планировщика; меньше точечных индексов обычно лучше «ковра» из индексов.
Чеклист:
- Сопоставьте семейство индекса с формой предиката.
- Partial indexes — для стабильных подмножеств фильтра.
- В composite сначала equality, потом range.
- Проверяйте через EXPLAIN (ANALYZE, BUFFERS).