JSONB数据类型查找成本在Postgres中



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

但我阅读了jsonb数据类型文档,但没有任何地方提到JSONB数据中的密钥的查找成本。

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

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

我想知道Postgres将如何解析以下查询:

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

在浏览一排的JSONB字段时,查找常数时间(O(1))或线性时间(在该行的JSONB字典中逐个检查每个键)

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

任何帮助都很好!

谢谢!

与SQL中的任何WHERE条件一样:如果没有索引,则数据库必须穿过表的所有行才能找到满足您条件的人。

您可以索引特定的表达式,也可以使用杜松子酒索引索引整个JSON值,然后如果使用任何支持的操作员,则可以使Postgres使用索引。

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

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

如果您不知道要寻找什么,杜松子酒指数可能是一个更好的选择:

create index on a using gin (info);

但是,您需要更改查询以使用由杜松子酒索引支持的操作员之一,例如使用包含操作员@>

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

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

如果您想在关系数据库中了解有关索引的更多信息,请在此处浏览材料:http://use-the-index-luke.com/

最新更新