Ответ
GIN (Generalized Inverted Index, или Обобщенный инвертированный индекс) — это специальный тип индекса в PostgreSQL, предназначенный для эффективной работы со сложными или составными типами данных, где один элемент может содержать множество значений.
Название «инвертированный» происходит от того, что он хранит не указатели от строки к значению, а наоборот — от каждого уникального значения к списку строк, где оно встречается. Это делает его идеальным для поиска «содержится ли значение X в Y».
Ключевые особенности и применение:
- Типы данных: Идеально подходит для
JSONB
,hstore
, массивов (text[]
,int[]
и др.) и полнотекстового поиска (tsvector
). - Операторы: Эффективно ускоряет операции содержания и пересечения, такие как
@>
(содержит),<@
(содержится в),&&
(пересекается),?
(существует ключ). - Производительность: Значительно ускоряет
SELECT
-запросы по сложным полям, но может быть медленнее при операцияхINSERT
/UPDATE
, так как обновление индекса более затратно, чем у B-Tree.
Пример для JSONB:
Предположим, у нас есть таблица товаров с характеристиками в формате JSONB.
CREATE TABLE products (
id SERIAL PRIMARY KEY,
properties JSONB
);
-- Создаем GIN-индекс для поля properties
CREATE INDEX idx_products_properties_gin ON products USING GIN (properties);
-- Этот запрос будет работать очень быстро благодаря индексу
SELECT * FROM products
WHERE properties @> '{"tags": ["electronics"]}';