PostgreSQL jsonb索引用于优化搜索性能

时间:2018-01-26 07:35:19

标签: postgresql jsonb

我正在使用PostgreSQL 10.1 jsonb 数据类型并设计具有以下结构的JSON文档:

{
    "guid": "9c36adc1-7fb5-4d5b-83b4-90356a46061a",
    "name": "Angela Barton",
    "is_active": true,
    "company": "Magnafone",
    "address": "178 Howard Place, Gulf, Washington, 702",
    "registered": "2009-11-07T08:53:22 +08:00",
    "latitude": 19.793713,
    "longitude": 86.513373,
    "timestamp": 2001-09-28 01:00:00,
    "tags": [
        "enim",
        "aliquip",
        "qui"
    ]
}

我需要通过基于标记进行搜索并按时间戳进行搜索来检索JSON文档。

我已阅读这些文档,并说 jsonb_path_ops 提供更好的性能:

  1. https://www.postgresql.org/docs/current/static/datatype-json.html#JSON-INDEXING
  2. https://www.postgresql.org/docs/current/static/gin-builtin-opclasses.html
  3. 索引标签,1。举了一个例子:

    CREATE INDEX idxgintags ON api USING GIN ((jdoc -> 'tags'));
    

    但是,该示例使用 jsonb_ops ,但我认为最好使用 jsonb_path_ops

    根据我的案例的需求,即能够基于标签进行搜索按时间戳排序,最佳方式是什么? strong>优化搜索性能 - 创建索引?如果专家可以给我创建索引的SQL和一些查询数据的例子,我将不胜感激。

    谢谢!

1 个答案:

答案 0 :(得分:2)

http://dbfiddle.uk/?rdbms=postgres_10&fiddle=cbb2336edf796f9b9458be64c4654394

因为你可以看到jsonb的一小部分有效的jsonb_ops接近于jsonb_path_ops。关闭尺寸,关闭时间,仅支持不同的操作员。如果你

,它会开始有很大的不同
CREATE INDEX idxgintags ON api USING GIN (jdoc);