> Какие индексы использовать для JSON по атрибутам в PostgreSQL (PostgreSQL, Java, JavaScript)

Уровень: middle · Роль: backend · Категория: Технические вопросы

Компании: Северсталь

Стек: PostgreSQL, Java, JavaScript

> Пример ответа

Для эффективной работы с JSON-атрибутами в PostgreSQL используйте GIN-индексы (Generalized Inverted Index). Они оптимизированы для поиска внутри JSONB-документов.

Основные варианты:

  1. GIN-индекс на всё JSONB-поле - для частых запросов по разным ключам:

    SQL
    CREATE INDEX idx_json_data ON table_name USING GIN (json_column);

    Поддерживает операторы ?, ?|, ?&, @>, @?, @@.

  2. Индекс на конкретный путь - для точечных запросов по одному атрибуту:

    SQL
    CREATE INDEX idx_json_name ON table_name USING GIN ((json_column -> 'name'));

    Или с приведением типа:

    SQL
    CREATE INDEX idx_json_age ON table_name USING BTREE ((json_column ->> 'age')::int);
  3. Составной индекс - для комбинации JSON-атрибута с обычным полем:

    SQL
    CREATE INDEX idx_json_composite ON table_name USING GIN (json_column jsonb_path_ops);

Рекомендации:

  • Используйте jsonb вместо json - он поддерживает индексацию и быстрее.

  • Для точного поиска по значению (например, WHERE json_column @> '{"status": "active"}') подходит GIN.

  • Для сортировки или диапазонных запросов (например, WHERE (json_column ->> 'age')::int > 18) используйте B-tree на выражение.

  • Если запросы часто используют один путь, создавайте индекс именно на него - это компактнее и быстрее, чем индекс на всё поле.

Пример запроса с индексом:

SQL
-- После создания GIN-индекса на всё поле
SELECT * FROM users WHERE json_column @> '{"city": "Moscow"}';

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью