我在这样的MySQL数据库上有一个左连接。。。

select  *
from tableA
left join tableB on (tableA.id=tableB.id1 and tableB.col2='Red')

…在表A和表B上的行数大于500K时执行正常
但是,将其更改为此(并假设索引正常)。。。
select  *
from tableA
left join tableB on
((tableA.id=tableB.id1 and tableB.col2='Red') OR
 (tableA.id=tableB.id2 and tableB.col2='Blue') )

…从性能上来说,是致命的。
那为什么演出成功?我能换个方式吗?

最佳答案

编辑
不确定你需要什么
你能展示一些预期的结果吗
你能告诉我们你所说的“在性能上杀死它”是什么意思吗
我不认为它更有效,但试试看。

select
    *
from
    tableA as a
    left join tableB as b1
        on a.id=b1.id1
        and b1.col2='Red'
    left join tableB as b2
        on a.id=b2.id2
        and b2.col2='Blue'
where
    (b1.id1 is not null or b2.id2 is not null)
    or (b1.id1 is null and b2.id2 is null)

你必须用SELECT来管理CASE WHEN中的结果。。。
您可以比较性能并将索引放在适当的列上(取决于完整表和查询中的内容,但这里应该是id, id1 and col2

关于mysql - SQL-使用OR运算子(MySQL)左联接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22926885/

10-16 18:53