MySQL:更快地执行多个条件的左连接

时间:2015-09-14 19:58:55

标签: mysql

我想在mySQL中执行左连接,这将在4个不同的标准上执行:

select 
    a.CommonVar, Var1, Var2, Var3
from 
    table1 as a
left join
    table2 as b on a.CommonVar = b.CommonVar 
                   or a.CommonVar= b.CommonVar2 
                   or a.CommonVar = b.CommonVar3 
                   or a.CommonVar = b.CommonVar4;

不幸的是,这需要一段难以置信的时间。任何人都可以提供任何想法,以执行此查询的另一种方式,这将产生相同的结果,但速度更快,时间更短?

提前谢谢

2 个答案:

答案 0 :(得分:0)

尝试使用IN()

select a.CommonVar, Var1, Var2, Var3
from table1 as a
left join
table2 as b
WHERE a.CommonVar IN(b.CommonVar, b.CommonVar2, b.CommonVar3, b.CommonVar4);

如果表记录太多,我可能会建议对表进行分区。

答案 1 :(得分:0)

它们是单独索引还是复合索引?在这种情况下,Composite不会帮助您。我不确定是否会单独使用此类连接(查询优化器可能无法单独利用它们)。

最糟糕的情况是,你可以试试这个:

SELECT a.CommonVar, Var1, Var2, Var3
FROM table1 AS a 
LEFT JOIN table2 AS b
ON a.CommonVar = b.CommonVar
UNION
SELECT a.CommonVar, Var1, Var2, Var3
FROM table1 AS a 
LEFT JOIN table2 AS b
ON a.CommonVar = b.CommonVar2
UNION
SELECT a.CommonVar, Var1, Var2, Var3
FROM table1 AS a 
LEFT JOIN table2 AS b
ON a.CommonVar = b.CommonVar3
UNION
SELECT a.CommonVar, Var1, Var2, Var3
FROM table1 AS a 
LEFT JOIN table2 AS b
ON a.CommonVar = b.CommonVar4
;

注意不会给出完全相同的结果。如果table1中的一行仅在CommonVar上匹配,则它可能会在结果中显示两次;一次匹配,再一次没有。这可以通过将其作为子查询来解析(可能使用GROUP_CONCAT()并通过a.CommonVar 进行分组。)