【问题标题】:jsonb data type lookup cost in postgrespostgres中的jsonb数据类型查找成本
【发布时间】:2019-08-03 05:57:33
【问题描述】:

这可能是一个显而易见且简单的问题。

但我通读了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】:

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

    您可以索引特定的表达式,也可以使用GIN index 索引整个 json 值,如果使用了任何受支持的运算符,则 Postgres 可以使用该索引。

    如果你总是检查城市,你可以创建一个常规的 B-Tree 索引:

    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/

    【讨论】:

    • 在 jsonb 数据没有任何索引的情况下,当它经过特定行时,它是否也经过 jsonb 数据中的所有键?还是查找恒定时间(如在字典中)?
    • @pranav3688:好吧,the manual says:“jsonb 数据以分解的二进制格式存储,这使得它 [...] 的处理速度显着加快,因为不需要重新解析 i>" - 所以我猜这涉及到某种查找字典
    猜你喜欢
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 2018-05-31
    • 2020-07-01
    • 1970-01-01
    • 2017-02-11
    • 2021-11-20
    • 2021-09-28
    相关资源
    最近更新 更多