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.