Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Dlaczego LEFT JOIN jest wolniejszy niż INNER JOIN?

Z INNER JOIN, MySQL zazwyczaj zaczyna się od tabeli z najmniejszą liczbą wierszy. W tym przypadku zaczyna się od tabeli finished i szuka odpowiedniego rekordu w saved za pomocą indeksu na saved.email .

W przypadku LEFT JOIN (z wyjątkiem niektórych optymalizacji) MySQL zazwyczaj łączy rekordy w kolejności (zaczynając od skrajnej lewej tabeli). W tym przypadku MySQL zaczyna się od tabeli saved , a następnie próbuje znaleźć każdy odpowiadający rekord w finished . Ponieważ nie ma użytecznego indeksuj w finished.email , musi wykonać pełne skanowanie dla każdego wyszukiwania.

Edytuj

Teraz, gdy opublikowałeś swój schemat, widzę, że MySQL ignoruje indeks (finished.email ) podczas przechodzenia z utf8 do latin1 zestaw znaków. Nie opublikowałeś zestawów znaków i sortowania dla każdej kolumny, więc przechodzę do domyślnego zestawu znaków dla tabeli. Zestawienia muszą być kompatybilne, aby MySQL mógł używać indeksu.

MySQL może wymusić (uaktualnić) latin1 sortowanie, które jest bardzo ograniczone, aż do utf8 sortowanie, takie jak unicode_ci (więc pierwsze zapytanie może użyć indeksu w saved.email aktualizując latin1 porównanie do utf8 ), ale nie jest odwrotnie (drugie zapytanie nie może użyć indeksu w finished.email ponieważ nie może obniżyć poziomu utf8 sortowanie do latin1 ).

Rozwiązaniem jest zmiana obu kolumn wiadomości e-mail na zgodne sortowanie, być może najłatwiej poprzez uczynienie ich identycznymi zestawami znaków i sortowaniem.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Laravel Eloquent with()-> zwracający wartość null

  2. Które wiersze są zwracane przy użyciu LIMIT z OFFSET w MySQL?

  3. Błąd kodowania podczas zapisywania danych z pliku excel do bazy danych (mysql)

  4. Jak zaktualizować zapomniane hasło, wysyłając wiadomość e-mail w mysql php

  5. Wyzwalacz MySQL zapobiegający INSERT pod pewnymi warunkami