middle
Когда какой тип индекса использовать?
Выбор типа индекса зависит от паттерна запросов: какой оператор используется в WHERE и какова природа данных.
| Задача | Рекомендуемый индекс |
|---|---|
| Поиск по равенству, диапазону, сортировка | B-tree |
| Только поиск по равенству | Hash |
| Поиск по массивам, JSONB, полнотекстовый поиск | GIN |
| Геоданные, диапазонные типы, нечёткий поиск | GiST |
| Большие таблицы с коррелированными данными (логи, временные ряды) | BRIN |
| IP-адреса, иерархические данные | SP-GiST |
Примеры для типового приложения
-- B-tree: поиск транзакций по номеру счёта
CREATE INDEX idx_tx_account ON transactions (account_id);
-- B-tree: сортировка по дате
CREATE INDEX idx_tx_date ON transactions (created_at DESC);
-- GIN: поиск по JSONB-метаданным платежа
CREATE INDEX idx_tx_meta ON transactions USING GIN (metadata jsonb_path_ops);
-- BRIN: огромная таблица аудит-логов (миллиарды записей)
CREATE INDEX idx_audit_ts ON audit_log USING BRIN (event_timestamp)
WITH (pages_per_range = 32);
-- GiST: поиск банкоматов по геолокации
CREATE INDEX idx_atm_location ON atms USING GiST (location);
-- GIN + pg_trgm: нечёткий поиск по имени клиента
CREATE EXTENSION IF NOT EXISTS pg_trgm;
CREATE INDEX idx_client_name_trgm ON clients USING GIN (full_name gin_trgm_ops);
SELECT * FROM clients WHERE full_name ILIKE '%иванов%';
На собеседовании: покажите практический подход — не абстрактное знание типов, а привязку к реальным задачам. BRIN для логов экономит место в сотни раз по сравнению с B-tree, GIN + pg_trgm решает задачу поиска «содержит подстроку» (ILIKE ‘%…%’), которую B-tree не может.