我正在开发一个 PostgreSQL 数据库,我需要根据 JSONB 列中的多个条件过滤行。列属性存储这样的数据
{
"color": "red",
"size": "large",
"shape": "circle"
}
我想找到行, 颜色是“红色”,尺寸是“大”
目前我使用像这样的@>运算符
SELECT *
FROM products
WHERE attributes @> '{"color": "red"}'
AND attributes @> '{"size": "large"}';
这可行,但我怀疑这不是最有效的方法,因为我稍后会添加更多条件。 创建 GIN 索引是否有助于提高性能?如果是,我应该如何创建它?
jsonb_path_ops
都支持包含@>
运算符。创建索引,vacuum analyze
表:
create index on products using gin(attributes);
vacuum analyze products;
explain analyze verbose
运行一些测试,甚至使用 pgbench 进行适当的基准测试。
您将获得多少提升取决于多种因素,例如表大小、值大小和复杂性、查询的其他部分等。
使用 jsonpath 表达式,您可以将所有这些条件压缩到单个
@?
操作。