【问题标题】:Best Way to Index All JSONB Fields With Boolean Values in PostgreSQL在 PostgreSQL 中使用布尔值索引所有 JSONB 字段的最佳方法
【发布时间】:2019-11-08 01:29:00
【问题描述】:

我正在创建一个具有features jsonb 列的表。会有一组动态的特征(每一行可以有一组未知的特征)。每个特征都是布尔真/假值。

例子:

  • 第 1 行:特征:{ "happy": true, "tall": false, "motivated": true }
  • 第 2 行:特征:{ "happy": true, "fast": true, "strong": false }
  • 第 3 行:特征:{ "smart": true, "fast": true, "sleepy": false }

索引此列的最佳方法是什么,以便我可以查询以查找所有具有 featureX = true 的行?我查找的所有示例似乎都需要一个字段名称来作为索引的基础。

【问题讨论】:

    标签: postgresql jsonb


    【解决方案1】:

    您可以在完整的 JSON 值上创建索引:

    create index on the_table using gin (features);
    

    它可以用于例如@> 运算符:

    select *
    from the_table
    where features @> '{"happy": true}'
    

    另一种方法是不存储键/值对,而仅在数组中列出“真实”的特征:["happy", "motivated"],然后使用? 运算符。这样 JSON 值会小一些,可能会更有效率。

    select *
    from the_table
    where features ? 'happy'
    

    或者如果您想测试多个功能:

    select *
    from the_table
    where features ?| array['happy', 'motivated']
    

    那也可以利用GIN索引

    【讨论】:

    • 可能值得注意的是,对布尔值的查询很可能没有选择性,虽然理论上可以使用索引,但它可能比只进行表扫描要慢。
    • 感谢您的详尽回答!如果我正在搜索多个功能(我肯定会),存储为数组是否可以更快地查找?在当前模式中,如果我必须执行 where features @> '{"happy": true, "motivated": true}' 之类的操作,它会退回到表扫描吗?
    • features @> '{"happy": true, "motivated": true}' 如果有意义,应该使用 GIN 索引。检查execution plan
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 2010-12-23
    • 2021-05-20
    • 2020-10-18
    • 1970-01-01
    相关资源
    最近更新 更多