postgres中的jsonb数据类型查找成本

问题描述 投票:0回答:1

这可能是一个明显而简单的问题。

但我读了jsonb数据类型documentation,但没有提到jsonb数据中密钥的查找成本。

例如,假设我有一个包含以下模式的表:

CREATE TABLE A (id character varying (20),
                info jsonb);

我想知道postgres如何解析where查询,如下所示:

SELECT * FROM A WHERE info->>'city' = 'portland';

在浏览行的jsonb字段时,是jsonb数据字典中的查找常量时间(O(1))还是线性时间(在行的jsonb字典中逐个检查每个键)?

我的直觉是它必须是恒定的时间(否则字典样式数据的重点是什么?)但我不能在官方文档中看到它来说服我的团队。

任何帮助都会很棒!

谢谢!

postgresql jsonb
1个回答
0
投票

与SQL中的任何WHERE条件一样:如果没有索引,则数据库必须遍历表的所有行以查找满足条件的那些行。

您可以索引特定表达式,也可以使用GIN index索引整个json值,然后在使用任何支持的运算符时使Postgres使用索引。

如果您始终检查城市,则可以创建常规B树索引:

create index on a ( (info->>'city') );

如果你不知道你要找什么,GIN索引可能是更好的选择:

create index on a using gin (info);

但是您需要更改查询以使用GIN索引支持的运算符之一,例如使用contains运算符@>

select *
from a 
where info @> '{"city": "portland"}::jsonb;

请注意,索引查找并不总是最有效的解决方案。有时简单地遍历所有行更快,有时索引查找更快。

如果您想了解关于关系数据库中索引的更多信息,请查看以下资料:http://use-the-index-luke.com/

© www.soinside.com 2019 - 2024. All rights reserved.