Если вы работаете с PostgreSQL и храните данные в формате JSONB, вы наверняка сталкивались с проблемой производительности при запросах по вложенным ключам. Вот практический приём, который реально улучшает эффективность таких запросов.
🔍 Проблема
Выполняя запрос:
SELECT *
FROM events
WHERE data->'user'->>'email' = 'user@example.com';
— вы полагаетесь на оператор
->> для извлечения значения, но такой запрос не использует индекс, даже если JSONB-колонка проиндексирована.✅ Решение: Используйте выражения + индекс по выражению
1. Создайте индекс по выражению:
CREATE INDEX idx_events_user_email
ON events ((data->'user'->>'email'));
2. Теперь ваш запрос будет использовать индекс:
SELECT *
FROM events
WHERE data->'user'->>'email' = 'user@example.com';
🚀 Бонус: Ускорение с GIN и
jsonb_path_opsЕсли вы часто фильтруете по множеству разных JSON-полей:
CREATE INDEX idx_events_data_gin
ON events USING GIN (data jsonb_path_ops);
И используйте операторы
@> для запросов:
SELECT *
FROM events
WHERE data @> '{"user": {"email": "user@example.com"}}';
📌 Такой подход отлично масштабируется и значительно снижает нагрузку на базу.
💡 Итог: Индексация по выражениям и правильный выбор оператора (`@>`, `->>`) — ключ к быстрой работе с JSONB в PostgreSQL.