这可能是一个明显而简单的问题。
但我读了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字典中逐个检查每个键)?
我的直觉是它必须是恒定的时间(否则字典样式数据的重点是什么?)但我不能在官方文档中看到它来说服我的团队。
任何帮助都会很棒!
谢谢!
与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/