首页 > 解决方案 > 未使用为 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))

通过这个,我不确定索引是否被用于搜索。

这整个设置好吗?

标签: postgresqlindexingjsonb

解决方案


您在 WHERE 子句中使用的表达式必须与索引中的表达式完全匹配,您的索引使用表达式:((properties -> 'hobbies'::text))但您的查询仅e.properties在左侧使用。

要使用该索引,您的 WHERE 子句需要使用与索引中使用的相同的表达式:

SELECT * 
FROM Employee e
WHERE (properties -> 'hobbies') @> '["trekking"]'
  AND e.department = 'Finance'

但是:您的执行计划显示表employee 非常小(rows=6)。对于这么小的表,无论您定义哪种索引,Seq Scan 始终是检索数据的最快方式。


推荐阅读