Mysql wählen, wo nicht in der Tabelle

stimmen
50

Ich habe 2 Tabellen (A und B) mit gleichen primären Schlüsseln. Ich möchte alle Zeilen auszuwählen, die in A sind und nicht in B. folgenden Arbeiten:

select * from A where not exists (select * from B where A.pk=B.pk);

jedoch scheint es ziemlich schlecht (~ 2 sec auf nur 100k Zeilen in A und 3-10k weniger in B)

Gibt es einen besseren Weg, dies zu laufen? Vielleicht als LEFT JOIN?

select * from A left join B on A.x=B.y where B.y is null;

Auf meinen Daten scheint dies etwas schneller (~ 10%), aber was im Allgemeinen zu laufen?

Veröffentlicht am 09/12/2008 um 20:52
quelle vom benutzer
In anderen Sprachen...                            


5 antworten

stimmen
50

Ich denke, Ihre letzte Aussage ist der beste Weg. Sie können auch versuchen

SELECT A.*    
from A left join B on 
    A.x = B.y
    where B.y is null
Beantwortet am 09/12/2008 um 21:09
quelle vom benutzer

stimmen
35

Ich benutze Abfragen im Format Ihrer zweiten Beispiel. Ein Join ist in der Regel besser skalierbar als eine korrelierte Unterabfrage.

Beantwortet am 09/12/2008 um 21:47
quelle vom benutzer

stimmen
2

Schließt sich in der Regel schneller (in MySQL), aber Sie sollten auch Ihre Indexierschema berücksichtigen, wenn Sie feststellen, dass es langsam nach wie vor bewegt sich. Im Allgemeinen als Fremdschlüssel (mit INNODB) alle Felder Setup wird bereits einen Index gesetzt haben. Wenn Sie MYISAM verwenden, stellen Sie sicher, dass alle Spalten in der ON-Anweisung indiziert sind, und berücksichtigt auch alle Spalten in der WHERE-Klausel am Ende des Index hinzufügen, um es Index einer Abdeckung zu machen. Dadurch kann der Motor den Zugriff auf alle im Index benötigten Daten haben, wodurch die Notwendigkeit eines zweiten Round-Trip zurück in die Originaldaten zu machen. Denken Sie daran, dass dies die Geschwindigkeit der Einsätze / Aktuelles / Löschungen auswirken, sondern die Geschwindigkeit der Abfrage erheblich erhöhen kann.

Beantwortet am 28/09/2010 um 22:58
quelle vom benutzer

stimmen
2

Ich benutze auch verbindet linke Seite mit einem Typ-Kriterien „wo table2.id null ist“.

Sicher scheint effizienter als die verschachtelte Abfrage Option.

Beantwortet am 27/05/2009 um 15:52
quelle vom benutzer

stimmen
-2

Das hat mir sehr geholfen. Joinsimmer schneller ist als Sub - Abfragen Ergebnisse zu geben:

SELECT tbl1.id FROM tbl1 t1
LEFT OUTER JOIN tbl2 t2 ON t1.id = t2.id 
WHERE t1.id>=100 AND t2.id IS NULL ;
Beantwortet am 14/12/2015 um 10:25
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more