如何解决在PostgreSQL中索引Josnb列
我在postgresql表中有一列,类型为jsonb。
{
.....
"type": "car","vehicleIds": [
"980e3761-935a-4e52-be77-9f9461dec4d1","980e3761-935a-4e52-be77-9f9461dec4d2"
]
.....
}
应用程序对这些字段运行查询以获取记录。我只需要为这些字段建立索引。
这怎么办?
这是具有属性作为列名的查询结构:
SELECT *
FROM Vehicle f
WHERE f.properties::text @@ CONCAT('$.vehicleIds[*] >',:vehicleId )= true
AND f.properties::text @@ CONCAT('$.type >',:type ) = true
解决方法
您正在使用的查询非常混乱,因为将@@
应用于text
值后,它归结为text search查询。
我也不了解'$.type > ...
的情况。对于car
这样的值,我希望有一个等于运算符,而不是“大于”。将>
与UUID一起使用似乎也没有意义。
如果要搜索类型为car
的值并且包含ID的列表,则使用“包含”运算符@>
是一种更好的方法:
SELECT *
FROM Vehicle f
WHERE f.properties @> '{"type": "car","vehicleIds": ["980e3761-935a-4e52-be77-9f9461dec4d1"]}'
以上内容可以利用properties
列上的GIN索引:
create index on vehicles using gin (properties);
如果type
键始终以相等的方式查询(我假设),则组合索引可能会更有效:
create index on vehicles using gin ( (properties ->> 'type'),(properties -> 'vehicleIds') );
您需要安装btree_gin扩展名才能创建该索引。
该索引会小一些,但是需要一个不同的查询:
SELECT *
FROM Vehicle f
WHERE f.properties ->> 'type' = 'car'
AND f.properties -> 'vehicleIds' @> '["980e3761-935a-4e52-be77-9f9461dec4d1"]'
您需要通过查看execution plan
来验证是否使用了索引以及哪些索引更有效。版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。