我在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
该问题的解决方案是什么?而且,如果我不需要在任何这些列上进行全文搜索(因为它们都是枚举类型),那么解决方案是否轻巧?
答案 0 :(得分:1)
如果您想在搜索条件中使用OR
,那就很糊糊了“game over” for performance(我有点夸张了。)
但是,如果您只有AND
个和相等条件,那么我想请您注意Bloom filters。
您只需要
CREATE EXTENSION bloom;
,然后一起在所有列上创建索引USING bloom
。
与其他索引不同,该单个索引可以使用WHERE
条件下的列的所有可能组合来加快查询速度。索引只是一个过滤器,它会传递一些误报,因此始终必须重新检查条件,但是它将大大加快查询的速度。