MySQL и PostgreSQL

JSON в MySQL и PostgreSQL: какая СУБД лучше хранит гибкие данные

Обе СУБД умеют хранить и обрабатывать JSON, но делают это по-разному: PostgreSQL исторически ушёл в этом вопросе дальше, предложив собственный бинарный формат JSONB с полноценной индексацией, а MySQL добавил нативный JSON-тип позже и с более скромным набором возможностей поиска внутри документа.

Зачем СУБД вообще уметь работать с JSON?

Не все данные удобно раскладывать по жёстким таблицам с фиксированным набором колонок. Например, у товаров в интернет-магазине могут быть совершенно разные характеристики: у одного — цвет и размер, у другого — объём памяти и цвет корпуса. Заводить отдельную колонку под каждую возможную характеристику неудобно и захламляет структуру базы.

Здесь на помощь приходит JSON — формат, в котором можно хранить произвольный набор полей внутри одной ячейки таблицы. Раньше для этого использовали обычный текст, а разбор и поиск делали на стороне приложения. Современные версии MySQL и PostgreSQL умеют работать с JSON прямо в базе: проверять его на корректность, искать по вложенным ключам и даже строить по ним индексы.

Как устроена поддержка JSON в MySQL?

MySQL получил отдельный тип данных JSON, который хранится не как обычный текст, а в оптимизированном внутреннем формате. Это позволяет базе быстрее проверять валидность документа и обращаться к его частям без полного разбора строки при каждом запросе.

Для работы с содержимым документа в MySQL есть набор функций: можно вытащить значение по конкретному пути внутри JSON, обновить только один вложенный ключ без переписывания всего документа, объединить несколько JSON-объектов. Это удобно, если в приложении нужно точечно менять отдельные поля, не трогая остальную структуру.

А как с этим обстоят дела в PostgreSQL?

В PostgreSQL пошли дальше и сделали два типа для JSON. Первый — обычный json, который хранит документ практически как есть, в текстовом виде. Второй — jsonb, бинарный формат, где данные при записи разбираются и раскладываются во внутреннюю структуру.

Разница на практике ощутимая: jsonb немного медленнее записывается, потому что база сразу разбирает документ, но заметно быстрее читается и ищется, потому что при каждом запросе не нужно повторно парсить текст. Именно поэтому в реальных проектах почти всегда выбирают jsonb, а обычный json оставляют для тех редких случаев, когда важно сохранить исходное форматирование документа буква в букву.

Можно ли строить индексы по содержимому JSON-поля?

Да, и здесь у PostgreSQL заметное преимущество. Для типа jsonb доступны специальные индексы, которые позволяют быстро искать документы по наличию определённого ключа или значения внутри вложенной структуры — без полного перебора всей таблицы. Это делает поиск по гибким данным почти таким же быстрым, как поиск по обычной колонке.

В MySQL индексировать содержимое JSON напрямую сложнее: чаще всего для этого создают дополнительную виртуальную колонку, которая автоматически вычисляется из нужного JSON-пути, а затем индексируют уже эту колонку. Способ рабочий, но требует чуть больше подготовительной работы при проектировании таблицы.

Клауд АйСи — цифровые сервисы для бизнеса в одном кабинете: 1С в облаке с ежедневными резервными копиями, конструктор сайтов, Умный онлайн-чат и проверка контрагентов.
Ваши данные под защитой. Есть бесплатные тарифы навсегда.

Какие запросы можно делать по JSON-полям?

В обеих СУБД можно фильтровать записи по значению внутри JSON, извлекать отдельные поля прямо в SELECT-запросе, а также обновлять только часть документа без перезаписи всего поля целиком. Разница в основном в синтаксисе функций и операторов, которые для этого используются.

Из типичных задач, которые решают через JSON-поля:

  • хранение переменного набора характеристик товаров или объектов каталога;
  • логирование событий с разной структурой данных в одной таблице;
  • хранение настроек пользователя или конфигурации приложения;
  • работа с данными, пришедшими из внешних API, где структура может меняться.

Интересный и легко проверяемый факт: сам формат JSON изначально придумали как упрощённую альтернативу XML для передачи данных между веб-сервисами, и лишь позже разработчики баз данных решили, что хранить такие документы удобно прямо внутри реляционной СУБД, а не только пересылать между программами.

Когда JSON в базе — это правильное решение, а когда лучше обычные таблицы?

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

Но если по полям регулярно строятся сложные отчёты, есть строгие связи между сущностями или важна целостность данных на уровне базы, обычные реляционные таблицы с внешними ключами всё равно остаются надёжнее. JSON стоит воспринимать как дополнение к классической структуре, а не как замену ей во всех случаях подряд.

Так какую СУБД выбрать, если в проекте много гибких данных?

Если работа с JSON — это лишь небольшая часть проекта, а основная нагрузка приходится на обычные реляционные запросы, разница между MySQL и PostgreSQL в этом вопросе не будет критичной: обе справятся. Но если гибкие документы — центральная часть логики приложения и по ним нужен быстрый поиск и сложная фильтрация, PostgreSQL с типом jsonb и специальными индексами обычно даёт больше возможностей из коробки.

При выборе стоит также учитывать команду и её опыт: если разработчики уже хорошо знают одну из СУБД, переучиваться ради возможностей JSON стоит только при реальной необходимости, а не «на всякий случай».

Как быть, если разбираться во всех этих настройках самостоятельно не хочется?

Не всем командам нужно вручную поднимать сервер базы данных, настраивать резервное копирование и следить за версией СУБД — это отдельная работа, которая отвлекает от разработки продукта. Сервис «Клауд АйСи» предлагает готовые облачные базы данных с поддержкой MySQL и PostgreSQL, где вопросы установки, обновлений и резервных копий берёт на себя платформа, а команда может сосредоточиться на структуре данных и логике приложения.

1С в облаке с резервным копированием

Зарегистрируйтесь и подключите облачную 1С — ежедневные бэкапы и обновления уже включены.

Частые вопросы

В чём главное отличие JSON от JSONB в PostgreSQL?

JSON хранится почти как обычный текст, а JSONB — в разобранном бинарном виде. JSONB быстрее читается и ищется, но немного медленнее записывается.

Можно ли индексировать JSON-поля в MySQL?

Прямого индекса по содержимому JSON нет, но можно создать виртуальную колонку с нужным значением из JSON-пути и построить индекс уже по ней.

Заменяет ли JSON обычные реляционные таблицы?

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

Какая СУБД лучше для активной работы с JSON?

PostgreSQL за счёт типа jsonb и специальных индексов обычно даёт больше возможностей для поиска и фильтрации внутри JSON-документов.