【问题标题】:How to optimize for multiple columns search for PostgreSQL如何针对 PostgreSQL 的多列搜索进行优化
【发布时间】:2019-03-31 14:33:42
【问题描述】:

我在 PostgreSQL 中有一个表,它有 20 列,大部分是枚举类型。这个表有数百万行。

我想支持并加快搜索具有多个字段的行的查询,例如:col2=value1&col3=value2&col5=value3 page=1

我不能使用 PostgreSQL 的复合索引, 因为它只适用于固定的列顺序。例如,如果我在(col2,col3,col5) 上建立索引,则它不能用于搜索col1=value1&col2=value2 的查询

我还想支持以下查询:

col1=value1&col2=(value3 or value4) orderby=col3 page=1

有什么办法可以解决这个问题?如果我不需要对这些列中的任何一个进行全文搜索(因为它们都是枚举类型),那么解决方案可以是轻量级的吗?

【问题讨论】:

  • col1...col20 的 distinct 组合有多少种?
  • 我会说任何列可能有数百种不同的组合
  • 您可以将它们收集到一个单独的表中,由单个(代理)键寻址。

标签: postgresql database-indexes


【解决方案1】:

如果您想在搜索条件中使用OR,那是相当糊涂的“game over” for performance(为了效果,我有点夸大了)。

但如果你只有ANDs 和相等条件,我想提请你注意Bloom filters

你只需要

CREATE EXTENSION bloom;

然后在所有列上一起创建索引USING bloom

与其他索引不同,这个单一索引可以加快对WHERE 条件中所有可能的列组合的查询。索引只是一个过滤器,会传递一些误报,因此总是需要重新检查条件,但它会显着加快查询速度。

【讨论】:

    猜你喜欢
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 2016-11-04
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多