json - 在 Postgres 中存储大量 JSON 数据是不可行的,那么有哪些替代方案呢?
问题描述
我的表的每条记录中都有大于 2kB 的大型 JSON 数据,目前,这些数据存储在 JSONB 字段中。我的技术栈是 Django 和 Postgres。我没有对此 json 数据执行任何更新/修改,但我确实需要频繁且快速地阅读它。但是,由于 JSON 数据大于 2kB,Postgres 将其拆分为块并放入 TOAST 表中,因此读取过程变得非常缓慢。那么有哪些替代方案呢?我应该使用像 MongoDB 这样的另一个数据库来存储这些大型 JSON 数据字段吗?注意:我不想从这个 JSON 中取出键并将它们变成列。此数据来自 API。
解决方案
在不了解您的具体情况的情况下很难具体回答,但您可以尝试以下一些方法:
- 使用 Postgres 12(存储)生成的列来维护通常需要的字段或较小的 JSON blob。这增加了存储开销,但您不必自己维护此副本。
- 为您查询的任何 JSON 字段创建索引(Postgresql 允许您为 JSON 表达式创建索引)。
- 使用复合索引,其中索引中的第一个字段是您要查询的字段,第二个字段(/json 表达式)是您希望检索的值。在这种情况下,Postgresql 应该从索引中检索值。
- 与 1 类似,创建一个物化视图,提取您需要的字段并允许您快速查询它们。您也可以向物化视图添加索引。这可能是一个很好的解决方案,因为物化视图的更新速度可能很慢,但在您的情况下,您的数据无论如何都不会更新。
- 调查为什么烤面包桌很慢。我不确定您看到的性能如何,但如果您确实需要撤回大量数据,那么无论您选择使用哪种数据库,您都需要快速数据访问。
您的里程可能会因上述所有建议而异,尤其是因为每个建议都取决于您的特定用例。(请参阅我评论中的问题)
但是,总体思路是使用 Postgresql 提供的工具来快速访问您的数据。是的,这可能涉及将数据从其原始 JSON blob 中提取出来,但这不需要手动完成。Postgresql 为此提供了一些很棒的工具。
推荐阅读
- node.js - Express 不加载页面只返回 json
- gitlab - 自托管 Gitlab 无效的 reCaptcha 密钥类型
- reactjs - 如何在反应中使用钩子将数组从子组件传递到父组件
- firebase - 实施 Firestore 时,Flutter Web 应用程序不会加载
- python - 使用 tensorflow 2.3 的 rgb_to_grayscale,得到“尺寸必须相等的错误”
- javascript - 在 ASP.Net MVC 中登录后显示 HTML 内容
- laravel - Laravel Resources 路由性能或收益
- python - multiprocessing.Process 从进程创建行到行尾重复调用主函数?
- mysql - 如何在mysql中的虚拟列上添加条件?
- r-raster - 在 R 错误中重新投影栅格“找不到函数”wkt