S INNER JOIN bude MySQL obecně začínat tabulkou s nejmenším počtem řádků. V tomto případě začíná tabulkou finished
a vyhledá odpovídající záznam v saved
pomocí indexu na saved.email
.
Pro LEFT JOIN (s výjimkou některých optimalizací) MySQL obecně spojuje záznamy v pořadí (počínaje tabulkou zcela vlevo). V tomto případě MySQL začíná tabulkou saved
, pak se pokusí najít každý odpovídající záznam v finished
. Protože neexistuje žádný použitelný index na finished.email
, musí provést úplnou kontrolu pro každé vyhledání.
Upravit
Nyní, když jste zveřejnili své schéma, vidím, že MySQL ignoruje index (finished.email
) při přechodu z utf8
na latin1
sada znaků. Nezveřejnili jste znakové sady a řazení pro každý sloupec, takže použiji výchozí znakovou sadu pro tabulku. Aby MySQL mohl index používat, musí být kolace kompatibilní.
MySQL může vynutit (upgradovat) latin1
řazení, které je velmi omezené, až do utf8
řazení, například unicode_ci
(takže první dotaz může použít index na saved.email
upgradem latin1
řazení do utf8
), ale opak není pravdou (druhý dotaz nemůže použít index na finished.email
protože nemůže downgradovat utf8
řazení dolů na latin1
).
Řešením je změnit oba sloupce e-mailu na kompatibilní řazení, snad nejsnáze tím, že z nich uděláte identické znakové sady a řazení.