Gymterview
middle

Какие типы индексов поддерживает 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 для огромных таблиц с хронологическими данными. Остальные назовите по сценарию применения.