【发布时间】:2018-11-29 21:48:13
【问题描述】:
由于某种原因,索引不用于“?”运算符。
让我们以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 Scan,而我希望进行索引扫描。有人能告诉我这里出了什么问题吗?
【问题讨论】:
-
您的表中有多少行?索引不会用于 5 行的表。
-
好问题!真实世界的数据库包含成千上万个条目,是的,事实证明 Postgresql 在像该示例这样的微小基础上以不同的方式工作(请参阅下面我对 jjanes 的回复)。
标签: postgresql indexing jsonb