Nie ma „lepszego” ani „gorszego” typu łączenia. Mają różne znaczenie i muszą być używane w zależności od tego.
W twoim przypadku prawdopodobnie nie masz pracowników bez logu pracy (brak wierszy w tej tabeli), więc LEFT JOIN
i JOIN
będą one równoważne w wynikach. Jednakże, jeśli miałeś coś takiego (nowy pracownik bez zarejestrowanego logu_dziennika), JOIN
wold pomija tego pracownika, podczas gdy lewe dołączenie (którego pierwszą tabelą są pracownicy) pokazywałoby ich wszystkich, a pola o wartościach zerowych na polach z logu_logowania_produktu, jeśli istnieją nie są dopasowaniami.
Ponownie, wydajność jest kwestią drugorzędną dla poprawności zapytań. Niektórzy mówią, że nie powinieneś używać LEFT JOIN
s. Prawdą jest, że LEFT JOIN zmusza optymalizator do wykonania zapytania w jednej określonej kolejności, co w niektórych przypadkach zapobiega niektórym optymalizacjom (zmianie kolejności tabel). Oto jeden przykład . Ale nie powinieneś wybierać jednego z drugiego, jeśli poprawność / znaczenie jest poświęcone, ponieważ WEJŚCIE WEWNĘTRZNE nie jest z natury gorsze. Pozostałe zwykłe optymalizacje obowiązują jak zwykle.
Podsumowując, nie używaj, LEFT JOIN
jeśli naprawdę masz na myśli INNER JOIN
.
W MySQL CROSS JOIN
, INNER JOIN
i JOIN
są takie same. Standardowo i semantycznie a CROSS JOIN
jest klauzulą INNER JOIN
bez ON
, więc otrzymujesz każdą kombinację wierszy między tabelami.
Masz przykłady wszystkich semantycznych typów łączenia na Wikipedii . W praktyce w MySQL zwykle piszemy JOIN
i LEFT JOIN
.
JOIN
bez zastrzeżeń oznaczaINNER JOIN
Które złączenie jest lepsze, jeśli wszystkie dają taki sam wynik?
Dodam poprzednią odpowiedź, z tego co wiem, MySQL jest zoptymalizowany pod kątem takiej samej wydajności.
Przy dobrych indeksach, na przykład, klauzula
JOIN
vsLEFT JOIN
+WHERE
do filtrowania, będzie to samo. Optymalizacja kontra czytanie ludzkie ma sens w przypadku dużych zapytań z dużą liczbą złączeń.Korzystanie z dobrych indeksów i pamięci podręcznej jest ważniejsze.
Dobre objaśnienie procesu optymalizacji można przeczytać tutaj:
Proces optymalizacji zapytania : Zapytanie często można wykonać na wiele różnych sposobów i uzyskać ten sam wynik. Zadaniem optymalizatora jest znalezienie najlepszej opcji.
źródło
Dla mnie to nie to samo, MySql 5.7 8 vCPU, 52 GB RAM
Poniższe zapytanie zajmuje ~ 30 sekund, nie jestem pewien, dlaczego
Tabela transakcji zawiera 24 257 151 rekordów
Tabela aktywności zawiera 18 603 665 rekordów
Tabela zakupów zawiera 13 911 705 rekordów
Wszystkie wymagane indeksy są na miejscu
Po zastąpieniu następującego wiersza:
z LEFT JOIN
to samo zapytanie zajmuje ~ 0,046s
Wyjaśnij przed:
Wyjaśnij po:
źródło