我有以下查询:
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
添加索引,因为我在数据库中有很多记录,我不想增加它的大小。
答案 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的文档中的更多内容: