postgresql - 未使用为 PostgreSQL jsonb 列创建的索引
问题描述
我为 jsonb 列中的字段创建了一个索引,如下所示:
create index on Employee using gin ((properties -> 'hobbies'))
生成的查询是:
CREATE INDEX employee_expr_idx ON public.employee USING gin (((properties -> 'hobbies'::text)))
我的搜索查询的结构如下:
SELECT * FROM Employee e
WHERE e.properties @> '{"hobbies": ["trekking"]}'
AND e.department = 'Finance'
对此查询运行 EXPLAIN 命令给出:
Seq Scan on employee e (cost=0.00..4452.94 rows=6 width=1183)
Filter: ((properties @> '{"hobbies": ["trekking"]}'::jsonb) AND (department = 'Finance'::text))
通过这个,我不确定索引是否被用于搜索。
这整个设置好吗?
解决方案
您在 WHERE 子句中使用的表达式必须与索引中的表达式完全匹配,您的索引使用表达式:((properties -> 'hobbies'::text))
但您的查询仅e.properties
在左侧使用。
要使用该索引,您的 WHERE 子句需要使用与索引中使用的相同的表达式:
SELECT *
FROM Employee e
WHERE (properties -> 'hobbies') @> '["trekking"]'
AND e.department = 'Finance'
但是:您的执行计划显示表employee 非常小(rows=6)。对于这么小的表,无论您定义哪种索引,Seq Scan 始终是检索数据的最快方式。
推荐阅读
- reactjs - Reactjs - 如何更改 sweetalert2 popup 的 inputValidator 的样式
- javascript - 解决承诺后如何不保存响应标头?
- python-3.x - 如何在 tkinter 中显示 matplotlib numpy.ndarray
- python - Python Selenium - 无效的语法错误,尝试除外
- swift - 下载后如何使用照片而无需再次下载?(在 Swift 中)
- python-3.x - Pytorch 灰度输入到 Vgg
- excel - 从用户突出显示的单元格创建具有特定格式的图形
- neo4j - Neo4j Cypher 命令删除节点和与之关联的唯一约束?
- python-3.x - Python:确定 SQL 选择列表中的 Oracle 数据库列数据类型
- c++ - 使用openCV捕获相机帧的延迟