SQL - 左连接与OR运算符(MySQL)

时间:2014-04-08 03:17:11

标签: mysql sql

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

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

...在tableA和tableB上使用> 500K行执行OK

然而,将其更改为此(并假设索引正常)......

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

......在表现方面杀了它。

那为什么性能会受到影响?我可以用另一种方式吗?

2 个答案:

答案 0 :(得分:1)

修改

不确定你需要什么

  • 你能否展示一些预期成果
  • 你能否告诉我们你的意思"杀死它,在性能方面" (它会延迟20秒的执行时间吗?)

我不相信它更有效但是尝试它。

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

答案 1 :(得分:0)

哦,没有注意到......这个怎么样......没有执行,所以你能够更好地判断。

select *
from tableB, tableA 
where (tableA.id=tableB.id1 and tableB.col2='Red') OR
 (tableA.id=tableB.id2 and tableB.col2='Blue')