PostgreSQL 多列索引,包括数组

Posted

技术标签:

【中文标题】PostgreSQL 多列索引,包括数组【英文标题】:PostgreSQL multi-column index including arrays 【发布时间】:2020-10-02 20:30:54 【问题描述】:

文档建议对数组列使用 GIN 索引。但是,我想通过该列和布尔列的组合进行查询,并且我不能将布尔值添加到索引中,因为 GIN 不支持该类型。我最好(a)为布尔列创建单独的索引,(b)使用不同的索引类型(哪个?),或者(c)不索引布尔列,因为在我的情况下,搜索结果集数组列索引只有几行,所以如果查询优化器在其中搜索匹配的布尔值,它只会进行少量比较?

create table foo (
    id integer generated by default as identity primary key,
    ...
    bar bool not null, -- TODO: Separate index? Cannot include bool in GIN index
    ...
    baz smallint[] not null);
create index foo_baz_idx on lambdas using gin (baz);

大多数查询将采用select * from foo where X = any(baz) and bar = Y 的形式,并且在单独搜索X 时最多会有少量行

【问题讨论】:

【参考方案1】:

这实际上取决于您的数据的性质。如果where X = any(baz) 的行数较少,则无需同时索引bar

如果where X = any(baz) 导致大量行,bar 上的单独索引可能会有所帮助;它会给查询计划者更多的选择。但由于它是一个布尔值,您可以在 bar 上代替 partition the table。然后每个查询都有效地在where bar = ? 上建立索引。

在某些情况下,查询性能可以显着提高,尤其是当表中大多数频繁访问的行位于单个分区或少量分区中时。分区替代了索引的前导列,减少了索引大小,并使索引的频繁使用部分更有可能适合内存。

当查询或更新访问单个分区的很大一部分时,可以通过利用该分区的顺序扫描而不是使用分散在整个表中的索引和随机访问读取来提高性能。

【讨论】:

以上是关于PostgreSQL 多列索引,包括数组的主要内容,如果未能解决你的问题,请参考以下文章

postgresql:具有外键的多个多列索引?

带表达式的多列索引(PostgreSQL 和 Rails)

选择最小值时不使用索引的PostgreSQL多列组

Postgresql:适用于(时间戳,字符串)的多列索引

postgresql 9.6 建立多列索引测试

PostgreSQL索引分类及使用