Ответ
Вопреки распространенному мнению, для сценария с большим количеством вставок (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
);