【问题标题】:When to use Json over key/value tables in postgres for billions of rows何时在 postgres 中对数十亿行的键/值表使用 Json
【发布时间】:2017-10-01 17:02:45
【问题描述】:

我正在做一个项目,我需要在 sql 数据库 (postgres) 中存储数十亿行非结构化 history_data 2-3 年。数据/列可能每天都在变化。

例如,用户可能会在第一天保存 {“user_id”:”2223”, “website”:”www.mywebsite.org”, “webpage”:”mysubpageName”}。

第二天 {“name”:”username”, “user_id”: “2223”, “bookclub_id”:”1” }。

我之前一直在做一个项目,我们使用经典的实体键/值表模型来解决这个问题。我们最多保存了 30 个键/值 pr 实体。但是当超过 70-100 行时,查询开始运行越来越慢(内部连接太多)。

因此我想知道是否应该在 postgres 中使用 Json 模型进行更改。在搜索网络和阅读博客之后,我真的很困惑。在 postgres 中将其更改为 json 的利弊是什么?

【问题讨论】:

    标签: json postgresql nosql


    【解决方案1】:

    您可以从查询复杂性的角度来考虑这一点。如果您有 json 文档的索引(可能是 user_id),您可以进行简单的索引扫描以非常快速地访问整个 json 字符串。

    然后你必须在客户端剖析它,或者你可以将它传递给 postgres 中的函数,例如您只想提取特定值的数据。

    在处理 json 时,postgres 最重要的特性之一是具有功能索引。与索引列值的“普通”索引相比,函数索引将函数应用于一个(甚至更多)列值的值并索引返回值。我不知道提取 json 字符串值的函数,但考虑到您想要具有 bookclub_id = 1 的用户。您可以创建一个索引,如

    create index idx_bookblub_id on mytable using getJsonValue("bookclub_id",mytable.jsonvalue)
    

    之后的查询像

    select * from mytable where getJsonValue("bookclub_id",mytable.jsonvalue) = 1
    

    快如闪电。

    【讨论】:

    • 对 Json 中的键进行索引,我读到,索引文件的大​​小可能会超出上限,从而使索引文件大于 db。我使用的是“简单”的,即 Json 中没有嵌套文件,但就像上面的示例和最多 30 个键/值 pr 实体。在那种情况下是否会担心索引大小?
    • 至少在我的情况下,我认为这不是问题。您可以随时在 pgAdminIII 中的索引统计选项卡上检查索引大小,因此请尝试一下并自己决定。
    • 我不确定,但当我输入时,我相信如果您使用另一种索引所有键值对的索引,您可能会看到一个大索引。然而,这不是 btree 索引,而是 GIS 索引?!?如果表本身不大于 100mb,我不在乎我的表的索引是否超过表大小 10 倍。速度提升可能是值得的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 2017-07-29
    • 2010-09-26
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    相关资源
    最近更新 更多