PostgreSQL索引JSONB数组

时间:2017-04-15 18:20:28

标签: json postgresql indexing

这是我的json

jsondata
------------------------------------
{"key1": 1, "keyset": [10, 20, 30]}
{"key1": 1, "keyset": [10, 20]}
{"key1": 1, "keyset": [30]}
{"key1": 1 }
{"key1": 1, "key2": 1}

我尝试为上面的示例创建索引keyset 使用btree的第一个索引

CREATE INDEX test_keyset ON test_table (jsondata->'keyset');

使用gin的第二个索引

CREATE INDEX test_keyset ON test_table USING GIN(jsondata->'keyset');

并查询以选择keyset值10,

SELECT jsondata
FROM test
   JOIN LATERAL jsonb_array_elements_text(jsondata->'keyset') a(v)
      ON TRUE
WHERE a.v::integer = 10;

但它正在进行顺序扫描(检查所有行),任何人都可以建议我哪些索引方法是正确的(btree或gin)以及使用索引从json获取数据的有效方法,例如,我是postgres的新手

1 个答案:

答案 0 :(得分:3)

在表达式public class FootballTableContext : DbContext { public FootballTableContext() : base("DefaultConnection") { } } 上使用gin索引:

jsondata->'keyset'

您应该将查询中的表达式与create index test_keyset on test using gin((jsondata->'keyset')); 运算符一起使用:

@>

测试计划者是否可以使用索引:

select jsondata
from test
where jsondata->'keyset' @> '10'

              jsondata               
-------------------------------------
 {"key1": 1, "keyset": [10, 20, 30]}
 {"key1": 1, "keyset": [10, 20]}
(2 rows)