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)
Antworten:
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.
quelle