Проверяет понимание индексации JSONB-полей в PostgreSQL, что критично для производительности запросов к полуструктурированным данным.
JSONB в PostgreSQL хранится в бинарном разложенном виде, что позволяет строить по нему индексы. Однако обычный B-tree по колонке JSONB целиком малополезен: он сравнивает документы целиком, а не отдельные ключи. Поэтому на практике применяют два подхода: GIN-индексы для поиска по содержимому и B-tree по конкретному выражению для точечных запросов.
GIN (Generalized Inverted Index) индексирует отдельные ключи и значения внутри JSONB. Он поддерживает операторы @>, ?, ?|, ?&, @?, @@. Это лучший выбор, когда нужно искать документы, содержащие определённый ключ или пару ключ-значение.
CREATE INDEX idx_data_gin ON events USING gin (data);
-- Использует GIN-индекс
SELECT * FROM events
WHERE data @> '{"type": "click"}';
-- Поиск по наличию ключа
SELECT * FROM events WHERE data ? 'user_id';Если запросы всегда фильтруют по одному конкретному полю, эффективнее B-tree по выражению. Он компактнее GIN и быстрее для равенства и диапазонов.
CREATE INDEX idx_user_id ON events ((data->>'user_id'));
SELECT * FROM events
WHERE data->>'user_id' = '42';@> и @@.Итог: индексировать JSONB не только можно, но и нужно для производительности. Выбирайте GIN для гибкого поиска по содержимому и B-tree по выражению для частых точечных фильтров по конкретным ключам.
Уровень
Рейтинг:
4
Сложность:
6
Навыки
Postgres
SQL
Ключевые слова
Подпишись на Node.js Developer в телеграм