如何使用postgresql中的jsonb数据索引来获取数据

时间:2017-06-13 14:12:47

标签: sql postgresql

我在Postgresql 9.6上工作,  我在这里尝试代表Json键从表中获取数据,这是jsonb类型,  数据看起来像是

 [{"name": "gp1", "type": "A"}, {"name": "gp2", "type": "A"}, {"name": "gp2", "type": "A"}]

这里的模块是column_name,client_modules是表名。

我也使用以下查询

创建索引
create index myindex on client_modules((modules->>'name'));

问题是当我尝试使用以下查询从表中获取数据时

SELECT modules FROM client_modules WHERE modules @>'[{"name":"gp1"}]' or modules @> '{"name":"gp1"}';

我能够检索所需的数据,但在这种情况下,我的plpgsql查询在默认的seqscan索引上运行,

我也执行脚本

set enable_indexscan = on;
 AND 
set enable_seqscan = off;

但仍然在我的索引上运行查询,当我运行查询时它仍然在默认索引上运行。

1 个答案:

答案 0 :(得分:0)

对于PostgreSQL表达式索引,索引条件和过滤条件必须完全匹配。你的不匹配。你编入索引:

modules->>'name'

然后你搜索了:

modules @>'[{"name":"gp1"}]'

虽然您知道并且我知道这两个搜索在功能上是等效的,但PostgreSQL查询规划器并不知道它。所以你有两个选择:

  1. 将您的查询更改为“WHERE modules->> name =' gp1'
  2. 在整个JSONB字段上创建一般GIN索引:CREATE INDEX jsonb_all ON client_modules USING GIN (modules);