Med INNER JOIN vil MySQL generelt starte med tabellen med det mindste antal rækker. I dette tilfælde starter den med tabel finished
og slår op efter den tilsvarende post i saved
ved at bruge indekset på saved.email
.
For en LEFT JOIN (med undtagelse af nogle optimeringer) forbinder MySQL generelt posterne i rækkefølge (begyndende med tabellen længst til venstre). I dette tilfælde starter MySQL med tabellen saved
, og forsøger derefter at finde hver tilsvarende post i finished
. Da der ikke er nogen brugelig indeks på finished.email
, skal den lave en fuld scanning for hvert opslag.
Rediger
Nu hvor du har sendt dit skema, kan jeg se, at MySQL ignorerer indekset (finished.email
) når du går fra utf8
til latin1
tegnsæt. Du har ikke indsendt tegnsættene og kollationerne for hver kolonne, så jeg går efter standardtegnsættet for tabellen. Samlingerne skal være kompatible, for at MySQL kan bruge indekset.
MySQL kan tvinge (opgradere) en latin1
kollation, som er meget begrænset, op til en utf8
sortering såsom unicode_ci
(så den første forespørgsel kan bruge indekset på saved.email
ved at opgradere latin1
sortering til utf8
), men det modsatte er ikke sandt (den anden forespørgsel kan ikke bruge indekset på finished.email
da den ikke kan nedgradere en utf8
sortering ned til latin1
).
Løsningen er at ændre begge e-mail-kolonner til en kompatibel sortering, måske nemmest ved at gøre dem til identiske tegnsæt og sorteringer.