Какие типы индексов поддерживает PostgreSQL?
PostgreSQL поддерживает шесть типов индексов, каждый из которых оптимизирован для определённых сценариев. B-tree используется по умолчанию и покрывает большинство задач, но для JSON, массивов, геоданных и временных рядов нужны специализированные типы.
B-tree (по умолчанию)
Сбалансированное дерево поиска. Используется для операций сравнения: =, <, >, <=, >=, BETWEEN, IN, IS NULL, а также для LIKE 'prefix%'.
Пример
CREATE INDEX idx_users_email ON users (email);
Hash
Хеш-таблица. Оптимизирован только для операции равенства (=). Занимает меньше места, чем B-tree. С PostgreSQL 10 хеш-индексы WAL-безопасны (реплицируются).
Пример
CREATE INDEX idx_users_uuid ON users USING hash (external_id);
GIN (Generalized Inverted Index)
Обратный (инвертированный) индекс. Используется для составных значений: массивов, JSONB, полнотекстового поиска (tsvector), hstore.
Пример
CREATE INDEX idx_doc_content ON documents USING GIN (to_tsvector('russian', content));
CREATE INDEX idx_settings ON client_settings USING GIN (settings);
GiST (Generalized Search Tree)
Обобщённое дерево поиска. Используется для геоданных (PostGIS), диапазонных типов (int4range, tsrange), полнотекстового поиска, нечёткого поиска (pg_trgm).
Пример
CREATE INDEX idx_location ON branches USING GiST (coordinates);
CREATE INDEX idx_period ON contracts USING GiST (valid_period);
BRIN (Block Range Index)
Хранит мин/макс значения для диапазонов физических блоков. Очень компактный. Эффективен для больших таблиц, где данные физически коррелируют с порядком индексируемого столбца (например, временные метки при последовательной вставке).
Пример
-- Идеально для таблицы логов, где данные вставляются хронологически
CREATE INDEX idx_logs_created ON audit_logs USING BRIN (created_at);
SP-GiST (Space-Partitioned GiST)
Для данных с естественным кластерным разбиением: IP-адреса, телефонные номера, геоданные.
Пример
CREATE INDEX idx_ip ON connections USING SPGIST (ip_address inet_ops);
На собеседовании: не нужно знать все шесть наизусть — достаточно B-tree, GIN и BRIN. Покажите понимание: B-tree для сравнений, GIN для «содержит» (массивы, JSON, полнотекст), BRIN для огромных таблиц с хронологическими данными. Остальные назовите по сценарию применения.