jsonb @>的PostgreSQL索引搜索

时间:2017-07-11 07:57:10

标签: sql postgresql jsonb

我有以下查询:

 SELECT "survey_results".* FROM "survey_results" WHERE (raw @> '{"client":{"token":"test_token"}}');

EXPLAIN ANALYZE会返回以下结果:

 Seq Scan on survey_results  (cost=0.00..352.68 rows=2 width=2039) (actual time=132.942..132.943 rows=1 loops=1)
   Filter: (raw @> '{"client": {"token": "test_token"}}'::jsonb)
   Rows Removed by Filter: 2133
 Planning time: 0.157 ms
 Execution time: 132.991 ms
(5 rows)

我想在client字段内的raw键上添加索引,以便搜索速度更快。我不知道该怎么做。当我为整个raw列添加索引时,如下所示:

CREATE INDEX test_index on survey_results USING GIN (raw);

然后一切都按预期工作。我不想为整个raw添加索引,因为我在数据库中有很多记录,我不想增加它的大小。

1 个答案:

答案 0 :(得分:2)

如果您在示例中使用JSON对象作为atm,那么您可以像这样指定仅client索引:

CREATE INDEX test_client_index ON survey_results USING GIN (( raw->'client ));

但是,由于您在查询中使用@>运算符,因此在您的情况下,仅为该运算符创建索引可能是有意义的:

CREATE INDEX test_client_index ON survey_results USING GIN (raw jsonb_path_ops);

请参阅有关Postgres JSONB indexing的文档中的更多内容: