首页 > 解决方案 > PostgreSQL 多列索引,包括数组

问题描述

文档建议对数组列使用 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

标签: postgresqldatabase-indexes

解决方案


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

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

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

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


推荐阅读