我在这样的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') )
......在表现方面杀了它。
那为什么性能会受到影响?我可以用另一种方式吗?
答案 0 :(得分:1)
修改
不确定你需要什么
我不相信它更有效但是尝试它。
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')