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.