【问题标题】:PostgreSQL: Index JSONB array that is queried with `@?` operatorPostgreSQL:使用“@?”运算符查询的索引 JSONB 数组
【发布时间】:2021-07-22 04:52:42
【问题描述】:

我的表 (table) 有一个 JSONB 字段 (data),其中包含一个带有数组的字段,我在其中存储标签 (tags)。 我使用如下表达式查询该表:

SELECT * FROM table WHERE data->'tags' @? '$[*] ? (@ like_regex ".*(foo|bar).*" flag "i");

有了这样的用例,我有办法索引data->'tags' 数组以加快查询速度吗?还是我应该将tags 数组从 JSONB 字段中移出并移入 TEXT[] 字段并为其编制索引?

我已经试过了:

CREATE INDEX foo ON tbl USING GIN ((data->'tags') jsonb_path_ops);

但它不起作用:https://gist.github.com/vkaracic/a62ac917d34eb6e975c4daeefbd316e8

【问题讨论】:

  • 在只有一行的表上测试索引是完全没有意义的。 Seq Scan 永远是这么小的桌子的最佳选择。您需要用更多数据(“数十万”)填充它来测试索引的效率

标签: postgresql indexing jsonb


【解决方案1】:

可以使用你建立的索引(如果你设置 enable_seqscan=off,你会看到它确实被使用了),但一般不会选择它,因为它对于这个查询毫无用处。它会通过索引排除的唯一行是根本没有 'tags' 键的行,即使这样估计也很差,因此如果不采取严厉措施,可能不会使用。

您可以尝试转换为 text[] 并使用 parray_gin,但可能更好的是转换为带有文本的子表,然后使用 pg_trgm。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多