PostgreSQL JSONB GIN 索引多条件
PostgreSQL JSONB GIN Index multi condition
我使用的是 PostgreSQL 13,我有一个 table,它有一个 JSONB 列和 GIN 索引。
我的问题是为以下查询找到更好的方法。我有多个ID,有时我需要找到它们。
我的架构:
id timestamp data
404599 2022-01-01 00:15:02.566 {"env": "worker", "id":1, "name": "foo", "lang": "en"}
404600 2022-01-01 00:15:02.685 {"env": "worker", "id":2, "name": "foo", "lang": "fr"}
404601 2022-01-01 00:15:02.808 {"env": "worker", "id":3, "name": "foo", "lang": "ru"}
404602 2022-01-01 00:15:03.023 {"env": "worker", "id":3, "name": "foo", "lang": "de"}
404603 2022-01-01 00:15:03.170 {"env": "worker", "id":4, "name": "foo", "lang": "tr"}
我的查询:
select * from foo where data @> '{"id": 1}' or data @> '{"id": 2}' or data @> '{"id": 3}';
我想为“data
”列使用 GIN 索引,但我找不到任何看起来像“in
”运算符的更好方法。
这是在 JSON 列上使用 GIN 索引进行查询的最佳方式。
如果您的所有查询都是这样,使用 b-tree 索引会更有效:
CREATE INDEX ON foo ((data ->> 'id'));
SELECT * FROM foo WHERE data ->> 'id' IN (1, 2, 3);
我使用的是 PostgreSQL 13,我有一个 table,它有一个 JSONB 列和 GIN 索引。
我的问题是为以下查询找到更好的方法。我有多个ID,有时我需要找到它们。
我的架构:
id timestamp data
404599 2022-01-01 00:15:02.566 {"env": "worker", "id":1, "name": "foo", "lang": "en"}
404600 2022-01-01 00:15:02.685 {"env": "worker", "id":2, "name": "foo", "lang": "fr"}
404601 2022-01-01 00:15:02.808 {"env": "worker", "id":3, "name": "foo", "lang": "ru"}
404602 2022-01-01 00:15:03.023 {"env": "worker", "id":3, "name": "foo", "lang": "de"}
404603 2022-01-01 00:15:03.170 {"env": "worker", "id":4, "name": "foo", "lang": "tr"}
我的查询:
select * from foo where data @> '{"id": 1}' or data @> '{"id": 2}' or data @> '{"id": 3}';
我想为“data
”列使用 GIN 索引,但我找不到任何看起来像“in
”运算符的更好方法。
这是在 JSON 列上使用 GIN 索引进行查询的最佳方式。
如果您的所有查询都是这样,使用 b-tree 索引会更有效:
CREATE INDEX ON foo ((data ->> 'id'));
SELECT * FROM foo WHERE data ->> 'id' IN (1, 2, 3);