Jeśli uznamy, że używasz INNER JOIN
zamiast LEFT JOIN
(co wydaje się twoim zamiarem), te dwa zapytania są funkcjonalnie równoważne. Optymalizatory zapytań sprawdzą i ocenią kryteria zawarte w WHERE
klauzuli i FROM
klauzuli oraz wezmą pod uwagę wszystkie te czynniki przy tworzeniu planów zapytań w celu osiągnięcia najbardziej wydajnego planu wykonania. Jeśli zrobimy EXPLAIN
na obu instrukcjach, otrzymamy ten sam wynik:
Zapytanie 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
[Wyniki] :
| 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 |
Zapytanie 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
[Wyniki] :
| 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 |
Możesz przejrzeć pełne informacje za pomocą poniższych linków. Stworzyłem również przykład SQL 2008, abyś mógł porównać działanie dwóch silników (co jest takie samo):
Przykład zapytania MySQL
Przykład zapytania w SQL 2008 (upewnij się, że „wyświetlasz plan wykonania” dla obu wyników)
INNER JOIN
, ale zLEFT JOIN
tym zwróci inne wyniki. Zasadniczo, warunki, które zostały dodane naWHERE
na drugim zapytaniu są konwersjaJOIN
na zasadzieINNER JOIN