Что такое GIN-индекс в PostgreSQL и когда его использовать?

Ответ

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"]}';