【发布时间】:2021-04-19 15:03:03
【问题描述】:
我有一张桌子:
CREATE TABLE skill (
user_id integer NOT NULL,
data jsonb
);
和 jsonb 列上的 gin 索引:
CREATE INDEX idx_user_id_knowledge ON skill USING gin (data);
INSERT INTO skill(user_id, data)
VALUES (1, '{"technology": "PHP", "knowledge": 77 }'),
(2, '{"technology": "PHP", "knowledge": 79 }'),
(3, '{"technology": "PHP", "knowledge": 97 }'),
(4, '{"technology": "MySQL", "knowledge": 85 }'),
(5, '{"technology": "MySQL", "knowledge": 89 }');
但是当我运行 EXPLAIN 查询时:
EXPLAIN
SELECT * FROM skill
WHERE data->>'technology' = 'PHP' AND (data->>'knowledge')::NUMERIC > 50;
输出如下:
Seq Scan on skill (cost=0.00..41.75 rows=2 width=36)
Filter: (((data ->> 'technology'::text) = 'PHP'::text) AND (((data ->> 'knowledge'::text))::numeric > '50'::numeric))
为什么查询规划器不使用我创建的 gin 索引而不是 Seq.扫描?
【问题讨论】:
-
如果只选择数据会发生什么'
-
rows=2,这几乎是一个空表。索引扫描永远不会比顺序扫描快。
标签: postgresql indexing jsonb sql-execution-plan explain