首页 > 解决方案 > 在 Postgres 中存储大量 JSON 数据是不可行的,那么有哪些替代方案呢?

问题描述

我的表的每条记录中都有大于 2kB 的大型 JSON 数据,目前,这些数据存储在 JSONB 字段中。我的技术栈是 Django 和 Postgres。我没有对此 json 数据执行任何更新/修改,但我确实需要频繁且快速地阅读它。但是,由于 JSON 数据大于 2kB,Postgres 将其拆分为块并放入 TOAST 表中,因此读取过程变得非常缓慢。那么有哪些替代方案呢?我应该使用像 MongoDB 这样的另一个数据库来存储这些大型 JSON 数据字段吗?注意:我不想从这个 JSON 中取出键并将它们变成列。此数据来自 API。

标签: jsondjangomongodbpostgresqljsonb

解决方案


在不了解您的具体情况的情况下很难具体回答,但您可以尝试以下一些方法:

  1. 使用 Postgres 12(存储)生成的列来维护通常需要的字段或较小的 JSON blob。这增加了存储开销,但您不必自己维护此副本。
  2. 为您查询的任何 JSON 字段创建索引(Postgresql 允许您为 JSON 表达式创建索引)。
  3. 使用复合索引,其中索引中的第一个字段是您要查询的字段,第二个字段(/json 表达式)是您希望检索的值。在这种情况下,Postgresql 应该从索引中检索值。
  4. 与 1 类似,创建一个物化视图,提取您需要的字段并允许您快速查询它们。您也可以向物化视图添加索引。这可能是一个很好的解决方案,因为物化视图的更新速度可能很慢,但在您的情况下,您的数据无论如何都不会更新。
  5. 调查为什么烤面包桌很慢。我不确定您看到的性能如何,但如果您确实需要撤回大量数据,那么无论您选择使用哪种数据库,您都需要快速数据访问。

您的里程可能会因上述所有建议而异,尤其是因为每个建议都取决于您的特定用例。(请参阅我评论中的问题)

但是,总体思路是使用 Postgresql 提供的工具来快速访问您的数据。是的,这可能涉及将数据从其原始 JSON blob 中提取出来,但这不需要手动完成。Postgresql 为此提供了一些很棒的工具。


推荐阅读