Próbuję porównać dwa zapytania:
Zapytanie 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
Zapytanie 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
Czy mam rację twierdząc, że te dwa zapytania dają takie same wyniki?
Ponadto, czy słuszne jest stwierdzenie, że pierwsze zapytanie buduje większą tabelę, dla której można wykonać większy WHERE
warunek; podczas gdy w drugim przypadku mamy mniejszą tabelę, do której WHERE
następnie stosuje się prosty .
Zakładając, że wyniki są takie same, które zapytanie powinno być preferowane? Czy jest oczywisty problem z wydajnością?
mysql
performance
Geoff
źródło
źródło
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
INNER JOIN
moje pytania dotyczące wydajności pozostały ważne?ON
i kryteriów filtrowania wWHERE
.Odpowiedzi:
Jeśli uznamy, że używasz
INNER JOIN
zamiastLEFT JOIN
(co wydaje się twoim zamiarem), te dwa zapytania są funkcjonalnie równoważne. Optymalizatory zapytań sprawdzą i ocenią kryteria zawarte wWHERE
klauzuli iFROM
klauzuli oraz wezmą pod uwagę wszystkie te czynniki przy tworzeniu planów zapytań w celu osiągnięcia najbardziej wydajnego planu wykonania. Jeśli zrobimyEXPLAIN
na obu instrukcjach, otrzymamy ten sam wynik:Zapytanie 1 :
[Wyniki] :
Zapytanie 2 :
[Wyniki] :
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)
źródło
INNER JOIN
zamiastLEFT JOIN
i uzyskuję ten sam wynik w dziesiątej części czasu. Chyba wiem, dlaczego otrzymuję taką samą moc wyjściową, ale dlaczego miałbymINNER JOIN
lepszą wydajność?LEFT JOIN
jak sprzężenie zewnętrzne, nie może ograniczyć zestawu danych po pełnej stronie powrotu zestawu i spróbuje pobrać wszystkie wiersze z tej tabeli (w tym przypadku TableA). Jeśli używaszINNER JOIN
, może wykorzystać te kryteria w obu tabelach i ograniczyć zestaw danych, zapewniając w ten sposób szybszy zwrot.