2017-10-10 97 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你可以檢查這種方法的時間嗎? –