Хранение больших JSON данных в Postgres невозможно, так каковы альтернативы? - PullRequest
0 голосов
/ 30 марта 2020

У меня есть большие JSON данные размером более 2 КБ в каждой записи моей таблицы, и в настоящее время они хранятся в поле JSONB. Мой технический стек - Django и Postgres. Я не выполняю никаких обновлений / модификаций этих json данных, но мне нужно их читать, часто и быстро. Однако из-за того, что данные JSON превышают 2 КБ, Postgres разбивает их на куски и помещает их в таблицу TOAST, и, следовательно, процесс чтения стал очень медленным. Так каковы альтернативы? Должен ли я использовать другую базу данных, например MongoDB, для хранения этих больших JSON полей данных? Примечание: я не хочу вытаскивать ключи из этого JSON и превращать их в столбцы. Эти данные поступают из API.

1 Ответ

0 голосов
/ 30 марта 2020

Трудно ответить конкретно, не зная деталей вашей ситуации, но вот некоторые вещи, которые вы можете попробовать:

  1. Использование Postgres 12 (сохранено) сгенерированные столбцы для поддержки полей или более мелких JSON сгустков, которые обычно необходимы. Это увеличивает нагрузку на хранилище, но освобождает вас от необходимости поддерживать это дублирование самостоятельно.
  2. Создание индексов для любых JSON полей , к которым вы обращаетесь (Postgresql позволяет создавать индексы для JSON выражений).
  3. Используйте составной индекс , где первое поле в индексе - это поле, к которому вы обращаетесь, а второе поле (/ json выражение) - это значение Вы будете sh, чтобы получить. В этом случае Postgresql должен извлечь значение из индекса.
  4. Аналогично 1, создать материализованное представление , которое извлекает необходимые поля и позволяет быстро запрашивать их. Вы также можете добавить индексы в материализованное представление. Это может быть хорошим решением, поскольку материализованные представления могут медленно обновляться, но в вашем случае ваши данные все равно не обновляются.
  5. Выясните, почему таблицы тостов работают медленно. Я не уверен, какую производительность вы видите, но если вам действительно нужно извлечь много данных, вам понадобится быстрый доступ к любой базе данных, которую вы выберете для go.

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

Однако общая идея состоит в том, чтобы использовать инструменты, предоставляемые Postgresql, для быстрого доступа к вашим данным. Да, это может включать извлечение данных из исходного JSON большого двоичного объекта, но это не нужно делать вручную. Postgresql предоставляет несколько отличных инструментов для этого.

...