Ответ
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"]}';