多列索引

时间:2018-06-20 10:30:31

标签: postgresql

我有4列,如果这4列中的任何一个与任何值数组匹配,我都想匹配一条记录,就像这样(语法不正确,但这是个主意):

SELECT * FROM y WHERE (col1,col2,col3,col4) IN (val1,val2,val3,val4)

现在我正在使用以下语法:

SELECT
 *
FROM
 y
WHERE
 col1 IN (val1,val2,val3,val4)
  OR
 col2 IN (val1,val2,val3,val4)
  OR
 col3 IN (val1,val2,val3,val4)
   OR
 col4 IN (val1,val2,val3,val4)

我在每列上有4个单独的索引,但是我想知道是否可以使用更好的多列索引类型。

有两个问题:

col1,col2,col3和col4的索引是否比单个索引更好?

where where子句的语法是什么?

1 个答案:

答案 0 :(得分:0)

在这种情况下,我推荐的一个索引是bloom filter

为此,您必须使用PostgreSQL v10并安装bloom扩展名:

CREATE EXTENSION bloom;

然后您可以创建一个多列索引:

CREATE INDEX ON y USING bloom (col1, col2, col3, col4);

此索引将支持您的查询。

如果OR导致性能问题,请尝试使用UNION

SELECT * FROM y WHERE col1 IN (val1,val2,val3,val4)
UNION
SELECT * FROM y WHERE col2 IN (val1,val2,val3,val4)
UNION
SELECT * FROM y WHERE col3 IN (val1,val2,val3,val4)
UNION
SELECT * FROM y WHERE col4 IN (val1,val2,val3,val4);