我有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子句的语法是什么?
答案 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);