Какой тип данных в PostgreSQL, JSON или JSONB, лучше подходит для сценария с частыми операциями вставки (INSERT) и редкими выборками (SELECT)?

Ответ

Вопреки распространенному мнению, для сценария с большим количеством вставок (INSERT) тип JSON технически будет быстрее на запись.

Однако, рекомендуемым и более практичным выбором в большинстве случаев все равно остается JSONB.

Ключевое различие

Характеристика JSON JSONB
Скорость вставки Высокая. Хранит точную текстовую копию. Нет затрат на парсинг при записи. Ниже, чем у JSON. Текст парсится, валидируется и преобразуется в оптимизированный бинарный формат.
Скорость чтения Низкая. Требует парсинга при каждом чтении или обращении к полям. Высокая. Данные уже в бинарном виде, готовы к обработке и запросам.
Хранение Сохраняет все пробелы, порядок ключей и дубликаты ключей. Не сохраняет лишние пробелы и порядок ключей. Удаляет дубликаты (оставляет последний).
Индексация Не поддерживается. Поддерживается (GIN), что кардинально ускоряет запросы к полям.

Вывод и рекомендация

Используйте JSON, только если ваша задача — это "записать и забыть", и вы уверены, что никогда не будете запрашивать или индексировать поля внутри JSON. Это крайне редкий случай.

Во всех остальных случаях выбирайте JSONB. Небольшое замедление при вставке многократно окупается эффективностью хранения, скоростью чтения и возможностями индексации, даже если SELECT-запросы редки.

-- Рекомендуемый вариант
CREATE TABLE logs (
    id SERIAL PRIMARY KEY,
    data JSONB
);

Ответ 18+ 🔞

Ага, слушай, вот тут народ часто заблуждается, как слепой кот в подвале. Говорят, мол, куча вставок — надо брать JSON. И технически-то они правы, ёпта! На запись JSON реально быстрее, это факт.

Но если ты не полный идиот, который пишет данные в чёрную дыру, чтобы их никогда не читать, то в 99.9% случаев тебе всё равно нужен JSONB. Вот так вот, в рот меня чих-пых!

В чём, блядь, разница, если по-простому?

Штука JSON (Текстовая копия) JSONB (Бинарный разум)
Запись Быстро, как угорелый. Скопировал текст — и в пизду, в таблицу. Никакого парсинга. Медленнее. Он этот текст разбирает, проверяет, что ты не накосячил, и упаковывает в бинарник.
Чтение Охуеть как медленно. Каждый раз, когда читаешь, он этот текст снова парсит. Представь, что ты каждый раз распаковываешь чемодан, чтобы посмотреть на носки. Молниеносно. Всё уже разложено по полочкам в бинарном виде. Достал и пользуйся.
Что хранит Всё как есть: пробелы, порядок ключей, даже дубликаты ключей (хотя это, блядь, уже извращение). Выкидывает лишние пробелы, порядок ключей может переставить, дубликаты ключей удаляет (оставляет последний, умный сука).
Индексы Никаких. Вообще. Забудь. Полный арсенал (GIN). Можно индексировать поля внутри JSON и искать со скоростью света.

Так что же делать, мудя?

Выбирай JSON только в одном, блядь, диком случае: если ты пишешь логи в архив, который откроют только после ядерного апокалипсиса, и то вряд ли. "Записал и забыл" — вот твой девиз.

А для всех нормальных, земных задач — бери JSONB. Да, при вставке он чуть подтормозит, но зато потом, когда тебе понадобится эти данные прочитать или, не дай бог, найти в них что-то — он тебя вывезет, как царь. Овердохуища пользы против мизерной потери на записи.

-- Делай так и не парься. Это правильный путь.
CREATE TABLE logs (
    id SERIAL PRIMARY KEY,
    data JSONB
);