【发布时间】:2020-07-11 06:20:27
【问题描述】:
我的表的每条记录中都有大于 2kB 的大型 JSON 数据,目前,这些数据存储在 JSONB 字段中。 我的技术栈是 Django 和 Postgres。 我没有对此 json 数据执行任何更新/修改,但我确实需要频繁且快速地阅读它。但是,由于 JSON 数据大于 2kB,Postgres 将其拆分为块并放入 TOAST 表中,因此读取过程变得非常缓慢。 那么有哪些替代方案呢?我应该使用像 MongoDB 这样的另一个数据库来存储这些大型 JSON 数据字段吗? 注意:我不想从这个 JSON 中取出键并将它们变成列。此数据来自 API。
【问题讨论】:
-
您的替代方案将取决于上下文。也许以相关方式存储它,而不是 JSON?
-
如果您能提供更多细节,我可能会提供答案:您大约有多少行? JSON blob 大约有多大?您需要取回所有 JSON 还是只取回其中的一部分?您是否在查询 JSON 中的值?您对数据库服务器的硬件了解多少(是否共享/专用、多少内存、是否在 SSD 上运行等)?
-
我认为问题不在于 JSONB 字段,而在于数据或行大于 2kB,导致数据存储在行外。 @ResonateAlpha,您是否尝试过以其他方式压缩数据?就我个人而言,我更喜欢将东西保存在一个持久存储解决方案中,然后使用一些内存数据结构(如 Redis)来缓存数据以实现高性能读取。这样,您的平台就不会依赖于多个故障点(例如,如果 mongodb 崩溃,您的系统就会失败,而如果 Redis 失败,您的网站只会运行得更慢)。
-
嗨,谢谢你们的快速反应。我正在使用此表来存储来自服务器不断命中的各种 api 的响应(JSON 数据)。因此,随着 api 被击中的次数越来越多,表的大小会不断增长。现在,如果有人决定使用相同的参数访问相同的 api(例如,一周后),并且我知道响应将是相同的(我知道响应何时会通过某些 webhook 更改),我将使用这个 db读取 json 并将其发送回请求者。
-
我不想以相关方式存储它,因为每个 api 都有不同类型的响应,并且某些键可能并不总是出现在每个响应中。我只需要将此数据存储为 json。
标签: json django mongodb postgresql jsonb