2017-10-10 1 views
0

ich drei Tabellen haben, T1(C1,C2), T2(C1,C2), T3(C1,C2), und ich möchte Zeilen aus T1 auszuwählen, die in T1 nicht in T2, T3 treten nur. Jetzt verwende ich einfach die left join, um dies zu tun.MySQL- LEFT JOIN

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; 

Aber das Problem ist, wie die Leistung zu verbessern, wenn die Datenbank sehr groß ist (z. Reihen> 10000000 in drei Tabelle). Mit LEFT JOIN die Abfrage zu lange dauert ...

+2

Gibt es Indizes für T1 (C1, C2), T2 (C1, C2) und T3 (C1, C2)? –

+0

Zu lange definieren? Möchten Sie den Ausführungsplan teilen (Profil + erklären)? –

+0

Sie wissen nicht, was der Engpass ist. Wie viele Datensätze werden dadurch erzeugt? Haben Sie 'EXPLAIN' und' profiling' verwendet, um zu sehen, was der Optimierer macht und was MySQL und OS tun, um Ihre Anfrage auszuführen und zu senden? Was bedeutet zu lange? In der IT haben wir Einheiten, um Größe und Zeit zu messen, können Sie ausdrücken, was zu lange in Sekunden bedeutet? – Mjh

Antwort

0

Drei Dinge, die sofort in den Sinn springen sind: - Indizes auf den Feldern für die verwendete Joins - Sie wirklich nur die Daten SELECT benötigen - geben Sie Ihre Datenbank-Server eine Menge Speicher

+0

Dies liefert keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlasse einen Kommentar unter seinem Beitrag. - [Aus Bewertung] (/ review/low-quality-posts/17582653) – GrumpyCrouton

-1

Eine Unterabfrage kann Ihnen hier helfen. Sie können auf diese Weise zusätzliche Kosten für linke Joins sparen.

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

Können Sie uns auf das Dokument verweisen, das erklärt, wie die Unterabfrage schneller ist als eine Links-/Innenverbindung? Aus Ihrer Antwort kann ich nur vermuten, dass Sie denken, Unterabfragen seien schneller als ein Beitritt, aber es gibt absolut keine Beweise oder Beweise dafür. – Mjh

+0

Ja @Mjh, das ist was ich denke. Ich habe diesen Ansatz für sehr große Datensätze ausprobiert und es funktioniert besser als ein Join. –

+0

@ lili-zhu können Sie bitte die Zeiten für diesen Ansatz überprüfen? –