在 Postgres 中搜索 JSON 数据哪个更有效:GIN 或多个索引列?

Ben*_*Ben 7 postgresql index json postgresql-9.6

例如,假设我有一个中等行数(约 100,000 行)的表,其中一jsonb列包含以下示例数据:

{"name":"Bob", "favoriteColor":"red", "someOtherObject": {"somethingElse": true}}
Run Code Online (Sandbox Code Playgroud)

是否更有效:

  1. 在 jsonb 列上使用 GIN 索引,然后使用 Postgres 的内置 JSON 查询函数来提取数据

  2. 创建多列来表示可以搜索的内容,即一列用于name,一列用于favoriteColor等;在这些列上构建 b 树索引,然后运行select document from table where name = 'Bob'

  3. 一些其他的解决方案?

    请记住,解决方案需要有效地支持like查询,以便能够搜索以给定输入字符串开头的值。

Erw*_*ter 11

JSON 的优点是通用性:您可以在不更改表定义的情况下添加任何键。如果您的应用程序可以直接读取和写入 JSON,那么可能会很方便。

单独的列在每个性能方面和其他几个方面优于组合jsonjsonb列:更复杂的类型系统,完整的功能范围(检查、唯一、外键约束、默认值等),表更小,索引更小,查询更快。

对于text列的前缀匹配,您可以使用text_pattern_ops索引:

或者,更一般地说,支持任何 LIKE模式的三元组索引:

虽然您坚持使用 JSON(jsonb特别是),但也有不同的索引策略。GIN 或 Btree 不是唯一要做出的决定。部分索引、表达式索引、不同的操作符类(特别是jsonb_path_ops:)相关:


归档时间:

查看次数:

5976 次

最近记录:

8 年,4 月 前