Ответ
PostgreSQL поддерживает несколько типов индексов, каждый из которых эффективен для определённых типов данных и запросов:
B-tree (B-дерево) — самый распространённый тип индекса, используется по умолчанию. Идеален для операций сравнения:
=
,>
,<
,BETWEEN
,IN
, а также для сортировки (ORDER BY
) и поискаNULL
значений. Подходит для большинства стандартных сценариев.Hash (Хеш-индекс) — оптимизирован только для операций точного равенства (
=
). Работает очень быстро, но не поддерживает диапазоны или сортировку. До PostgreSQL 10 считался ненадёжным, но теперь полностью журналируется (WAL-logged) и безопасен для использования.GIN (Generalized Inverted Index / Обобщённый инвертированный индекс) — предназначен для индексации составных типов данных, таких как массивы (
integer[]
), полнотекстовый поиск (tsvector
) и JSONB. GIN создаёт запись для каждого элемента внутри значения, что позволяет быстро находить строки, содержащие определённый элемент.GiST (Generalized Search Tree / Обобщённое поисковое дерево) — это шаблонный индекс, на основе которого можно реализовывать различные стратегии индексирования. Часто используется для геоданных (PostGIS), полнотекстового поиска и других сложных, нерегулярных структур данных.
SP-GiST (Space-Partitioned GiST / Пространственно-разделённое GiST) — расширение GiST, эффективное для данных с нерегулярной структурой, которые не сбалансированы (например, префиксы телефонных номеров, IP-адреса).
BRIN (Block Range INdexes / Индексы по диапазонам блоков) — разработан для очень больших таблиц, данные в которых имеют естественную корреляцию с их физическим расположением на диске (например, временные ряды, логи). Хранит только минимальное и максимальное значение для диапазона блоков, что делает его очень компактным.
Пример создания:
-- Стандартный B-tree индекс для ускорения поиска по email
CREATE INDEX idx_users_email ON users(email);
-- GIN индекс для поиска внутри JSONB поля
CREATE INDEX idx_profiles_data ON profiles USING GIN(profile_data);
Выбор правильного типа индекса критически важен для производительности базы данных и зависит от структуры данных и характера запросов.