Ich versuche zwei Fragen zu vergleichen:
Abfrage 1:
SELECT a,b,c,d,e
FROM tableA
LEFT JOIN tableB
ON tableA.a=tableB.a
WHERE tableA.b=tableB.b AND tableA.c=tableB.c AND tableA.d=tableB.d AND tableA.e=tableB.e
Abfrage 2:
SELECT a,b,c,d,e
FROM tableA
LEFT JOIN tableB
ON tableA.a=tableB.a AND tableA.b=tableB.b AND tableA.c=tableB.c AND tableA.d=tableB.d
WHERE tableA.e=tableB.e
Bin ich richtig zu sagen, dass diese beiden Abfragen die gleichen Ergebnisse liefern?
Ist es richtig zu sagen, dass die erste Abfrage eine größere Tabelle erstellt, für die eine größere WHERE
Bedingung erfüllt werden soll? Im zweiten Fall haben wir eine kleinere konstruierte Tabelle, auf die dann das Einfache WHERE
angewendet wird.
Welche Abfrage sollte bei gleichem Ergebnis bevorzugt werden? Gibt es ein offensichtliches Leistungsproblem?
mysql
performance
Geoff
quelle
quelle
INNER JOIN
, aber mit einem wirdLEFT JOIN
dies unterschiedliche Ergebnisse zurückgeben. GrundsätzlichWHERE
konvertieren die Bedingungen, die Sie in Ihrer zweiten Abfrage hinzugefügt haben, IhreJOIN
auf einemINNER JOIN
INNER JOIN
meine Fragen zur Leistung bearbeite, bleiben sie gültig?ON
und Filterkriterien in verwendenWHERE
.Antworten:
Wenn wir davon ausgehen, dass Sie
INNER JOIN
anstelle vonLEFT JOIN
(was Ihre Absicht zu sein scheint) verwenden, sind diese beiden Abfragen funktional gleichwertig. Abfrageoptimierer überprüfen und bewerten die Kriterien in IhrerWHERE
Klausel und in IhrerFROM
Klausel und berücksichtigen alle diese Faktoren beim Erstellen von Abfrageplänen, um den effizientesten Ausführungsplan zu erzielen. Wenn wirEXPLAIN
zu beiden Anweisungen eine machen, erhalten wir das gleiche Ergebnis:Abfrage 1 :
[Ergebnisse] :
Abfrage 2 :
[Ergebnisse] :
Sie können die vollständigen Details unter den folgenden Links einsehen. Ich habe auch ein SQL 2008-Beispiel erstellt, damit Sie vergleichen können, wie die beiden Engines funktionieren (was dasselbe ist):
Beispiel für eine MySQL-Abfrage
SQL 2008-Abfragebeispiel (Stellen Sie sicher, dass Sie für beide Ergebnisse den Ausführungsplan anzeigen.)
quelle
INNER JOIN
stattdessen versuchtLEFT JOIN
und erhalte in einem Zehntel der Zeit die gleiche Ausgabe. Ich denke, ich weiß, warum ich die gleiche Ausgabe erhalte, aber warum hätte eineINNER JOIN
bessere Leistung?LEFT JOIN
es sich um einen Outer-Join handelt, kann er die Datenmenge auf der vollständigen Rückgabeseite der Menge nicht einschränken und versucht, alle Zeilen aus dieser Tabelle (in diesem Fall TableA) abzurufen. Wenn Sie verwendenINNER JOIN
, kann es diese Kriterien für beide Tabellen nutzen und den Datensatz einschränken, wodurch eine schnellere Rendite erzielt wird.