由于某种原因索引未用于“?”运算符。
让我们来看看这个示例https://schinckel.net/2014/05/25/querying-json-in-postgres/:
CREATE TABLE json_test (
id serial primary key,
data jsonb
);
INSERT INTO json_test (data) VALUES
('{}'),
('{"a": 1}'),
('{"a": 2, "b": ["c", "d"]}'),
('{"a": 1, "b": {"c": "d", "e": true}}'),
('{"b": 2}');
并创建一个索引。
create index json_test_index on public.json_test using gin (data jsonb_path_ops) tablespace pg_default;
然后查看以下查询的计划:
SELECT * FROM json_test WHERE data ? 'a';
会有Seq扫描,而我希望进行索引扫描。请问有人在这里出什么问题吗?
答案 0 :(得分:1)
来自the docs:“非默认GIN运算符类jsonb_path_ops仅支持对@>运算符进行索引。”它不支持?
运算符。
因此,请改用jsonb的默认运算符(如果您希望明确将其拼写,则称为“ jsonb_ops”)。
但是如果您的表只有5行,则除非您通过set enable_seqscan = off
强制使用索引,否则它可能不会使用索引。