Wenn wir davon ausgehen, dass Sie INNER JOIN
anstelle von LEFT JOIN
(was Ihre Absicht zu sein scheint) verwenden, sind diese beiden Abfragen funktional gleichwertig. Abfrageoptimierer überprüfen und bewerten die Kriterien in Ihrer WHERE
Klausel und in Ihrer FROM
Klausel und berücksichtigen alle diese Faktoren beim Erstellen von Abfrageplänen, um den effizientesten Ausführungsplan zu erzielen. Wenn wir EXPLAIN
zu beiden Anweisungen eine machen, erhalten wir das gleiche Ergebnis:
Abfrage 1 :
EXPLAIN
SELECT
tableA.ColA
,tableA.ColB
,tableA.ColC
,tableA.ColD
,tableA.ColE
FROM tableA
JOIN tableB ON tableA.ColA=tableB.ColA
WHERE
tableA.ColB=tableB.ColB
AND tableA.ColC=tableB.ColC
AND tableA.ColD=tableB.ColD
AND tableA.ColE=tableB.ColE
[Ergebnisse] :
| ID | SELECT_TYPE | TABLE | TYPE | POSSIBLE_KEYS | KEY | KEY_LEN | REF | ROWS | EXTRA |
------------------------------------------------------------------------------------------------------------------------
| 1 | SIMPLE | tableA | ALL | (null) | (null) | (null) | (null) | 1 | |
| 1 | SIMPLE | tableB | ALL | (null) | (null) | (null) | (null) | 1 | Using where; Using join buffer |
Abfrage 2 :
EXPLAIN
SELECT
tableA.ColA
,tableA.ColB
,tableA.ColC
,tableA.ColD
,tableA.ColE
FROM tableA
JOIN tableB ON tableA.ColA=tableB.ColA
AND tableA.ColB=tableB.ColB
AND tableA.ColC=tableB.ColC
AND tableA.ColD=tableB.ColD
WHERE
tableA.ColE=tableB.ColE
[Ergebnisse] :
| ID | SELECT_TYPE | TABLE | TYPE | POSSIBLE_KEYS | KEY | KEY_LEN | REF | ROWS | EXTRA |
------------------------------------------------------------------------------------------------------------------------
| 1 | SIMPLE | tableA | ALL | (null) | (null) | (null) | (null) | 1 | |
| 1 | SIMPLE | tableB | ALL | (null) | (null) | (null) | (null) | 1 | Using where; Using join buffer |
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.)
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