Ist es besser, Filter für JOIN-Klauseln anstelle von WHERE-Klauseln zu verwenden?

7

MySQL 5.5.8:

Frage 1:
Gibt es einen Unterschied in den folgenden Aussagen und wenn ja, welche Leistung wird bevorzugt? Kann dies auch beantwortet werden, ohne die Zeilenanzahl der Tabellen vor und nach der where-Klausel und die mögliche Indexverwendung zu kennen?

SELECT *
FROM a JOIN b ON a.id = b.id AND a.col2 BETWEEN 1 AND 5;

SELECT *
FROM a JOIN b ON a.id = b.id
WHERE a.col2 BETWEEN 1 AND 5;

Mein Grund für die Frage ist, dass wenn beispielsweise die Tabellen massiv sind, die where-Klausel jedoch 99,9999% der Datensätze herausfiltert, ich keine Zeit damit verschwenden möchte, massive Tabellen zu verbinden, wenn nach dem Join 99,9999% der Datensätze nicht verwendet werden.

Frage 2:

Nehmen Sie die gleiche Situation, welche Aussage (wenn es einen Unterschied gibt) weniger IOPS erfordert. (Index auf b.id und einer auf a.col2 vorhanden)

naschoff
quelle
Meine Antwort auf Frage 1 wurde entfernt, da Sie bereits mehr Antworten hatten. Wir könnten die Ausgabe der Show-Create-Tabelle verwenden, um Ihnen eine bessere Antwort auf Frage 2
Raymond Nijland,

Antworten:

10

Bei jedem guten Abfrageplaner (und IIRC-MySQL ist diesbezüglich gut genug) für Abfragen, bei denen alle Joins innere Joins sind (wie hier, sofern nicht anders angegeben, sind Joins standardmäßig innere Joins), spielt es keine Rolle, ob Sie die Filterung oder setzen Vergleiche in einer ON-Klausel oder im WHERE verbinden.

Bei äußeren Verknüpfungen mit komplizierteren Abfragen ist dies viel weniger eindeutig, da die Position der Filterklausel abhängig von den Eingabedaten einen signifikanten Effekt haben kann (aber nicht immer).

Um sich selbst zu überzeugen, generieren Sie einen großen Datensatz und versuchen Sie beide, um festzustellen, ob es einen Unterschied gibt. Als Lernübung, um ein gutes Gefühl dafür zu bekommen, was die Optimierungen in der von Ihnen gewählten DB-Engine bewirken können und was nicht, ist nur wenig besser als durchdachtes Experimentieren, Überwachen und Benchmarking.

David Spillett
quelle
1
Sie haben Recht, das erste, was der Optimierer mit INNER JOINS macht, ist das Zusammenführen von ON- und WHERE-Bedingungen.
Jynus
@jynus wie man herausfindet, dass INNER JOINS die Bedingungen ON und WHERE zusammenführen.
James
Sie können Join-Logik unter github.com/mysql/mysql-server/blob/8.0/sql/…
jynus