2017-10-10 108 views
0

我有三个表,T1(C1,C2)T2(C1,C2)T3(C1,C2),我想选择T1行只发生在T1T2T3。 现在我只用left join来做到这一点。Mysql-左加入

SELECT C1,C2 
FROM T1 
LEFT JOIN T2 ON T1.C1=T2.C2 AND T1.C2=T2.C2 
LEFT JOIN T3 ON T1.C1=T3.C2 AND T1.C3=T2.C2 
WHERE T2.C1 IS NULL AND T3.C1 IS NULL; 

但问题是,如何提高数据库相当大的性能(例如在三个表中的行数> 10000000)。使用LEFT JOIN查询时间太长......

+2

T1(C1,C2),T2(C1,C2)和T3(C1,C2)上是否存在索引? –

+0

定义过长?想分享执行计划(简介+解释)? –

+0

你不知道什么是瓶颈。有多少记录是由此产生的?您是否使用'EXPLAIN'和'profiling'来查看优化器的功能以及MySQL和OS为执行和发送查询所做的事情?什么太长意味着什么?在IT部门,我们有单位来衡量规模和时间,你能在几秒钟内表达什么意思吗? – Mjh

回答

0

三件事情立即跳转到记有: - 对用于该领域的指数联接 - 只选择真正需要 数据 - 给你的数据库服务器很多内存

+0

这不提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 - [来自评论](/ review/low-quality-posts/17582653) – GrumpyCrouton

-1

子查询可以帮助你在这里。您可以通过这种方式节省左连接的额外成本。

SELECT 
C1,C2 
FROM 
T1 
WHERE 
C1 NOT IN (
SELECT C1 FROM T2 
UNION ALL 
SELECT C1 FROM T3 
); 
+0

你能指点我们解释子查询如何快于左/内连接的文档吗?从你的回答中,我可以推测的是,你认为子查询比加入更快,但是绝对没有证据或证明原因。 – Mjh

+0

是@Mjh,这是我的想法。我在非常大的数据集上尝试了这种方法,它比联接更好。 –

+0

@ lili-zhu你可以检查这种方法的时间吗? –