Frage

Ich habe 2 Tabellen (A und B) mit dem gleichen Primärschlüssel. 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);

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

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

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

Auf meinen Daten dieser etwas schneller zu laufen scheint (~ 10%), aber was ist in der Regel?

War es hilfreich?

Lösung

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

Andere Tipps

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

Ich benutze auch links schließt sich mit einem „wo table2.id null ist“ Typ Kriterien.

scheint sicher effizienter als die verschachtelte Abfrage Option zu sein.

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 kann erheblich die Geschwindigkeit der Abfrage erhöhen.

Das hat mir sehr geholfen. Joins sind immer schneller 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 ;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top