Gymterview
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 не может.