Ответ
Основное различие в том, что JSON
хранит точную текстовую копию входных данных, а JSONB
— в декомпозированном бинарном формате. Это определяет все остальные отличия.
Характеристика | JSON | JSONB |
---|---|---|
Хранение | Хранится как обычный текст. Сохраняет все пробелы, порядок ключей и дубликаты ключей. | Хранится в бинарном формате. Пробелы удаляются, порядок ключей не сохраняется, а при дубликатах остается только последнее значение. |
Производительность | Медленный на чтение. Требует парсинга при каждом запросе. | Быстрый на чтение. Данные уже распарсены, что значительно ускоряет операции. Вставка немного медленнее, чем у JSON , из-за преобразования в бинарный формат. |
Индексация | Ограниченные возможности. Нельзя напрямую индексировать все операторы. | Полная поддержка индексов GIN (Generalized Inverted Index ), что позволяет эффективно индексировать и быстро искать по ключам и значениям внутри JSON-документа. |
Операторы | Поддерживает только базовые операторы (-> , ->> ). | Поддерживает все операторы JSON , а также расширенные операторы для проверки вложенности (@> , <@ ), наличия ключей (? , ?| , ?& ) и другие. |
Пример использования оператора, доступного только для JSONB
:
-- Поиск всех записей, где в data_jsonb есть ключ "key"
SELECT * FROM test WHERE data_jsonb ? 'key';
-- Поиск всех записей, где data_jsonb содержит объект {"active": true}
SELECT * FROM test WHERE data_jsonb @> '{"active": true}';
Когда что использовать:
JSON
: Используйте, если вам нужно хранить JSON-данные как есть, с сохранением исходного форматирования, пробелов и порядка ключей (например, для логирования запросов). Запросы к данным нечастые.JSONB
: Используйте в 99% случаев. Если вы планируете активно запрашивать, фильтровать или изменять данные внутри JSON,JSONB
— ваш выбор из-за высокой производительности и мощных возможностей индексации.