Bij INNER JOIN begint MySQL over het algemeen met de tabel met het kleinste aantal rijen. In dit geval begint het met tabel finished
en zoekt het corresponderende record op in saved
met behulp van de index op saved.email
.
Voor een LEFT JOIN (met uitzondering van enkele optimalisaties) voegt MySQL de records over het algemeen in volgorde samen (beginnend met de meest linkse tabel). In dit geval begint MySQL met de tabel saved
en probeert vervolgens elk corresponderend record te vinden in finished
. Aangezien er geen bruikbare . is index op finished.email
, het moet voor elke zoekopdracht een volledige scan uitvoeren.
Bewerken
Nu je je schema hebt gepost, kan ik zien dat MySQL de index negeert (finished.email
) wanneer u van utf8
. gaat naar latin1
karakterset. Je hebt niet de karaktersets en sorteringen voor elke kolom gepost, dus ik ga voor de standaard karakterset voor de tabel. De sorteringen moeten compatibel zijn zodat MySQL de index kan gebruiken.
MySQL kan een latin1
. dwingen (upgraden) verzameling, die zeer beperkt is, tot een utf8
sortering zoals unicode_ci
(zodat de eerste zoekopdracht de index kan gebruiken op saved.email
door latin1
te upgraden sortering naar utf8
), maar het tegenovergestelde is niet waar (de tweede zoekopdracht kan de index op finished.email
niet gebruiken omdat het een utf8
. niet kan downgraden sortering tot latin1
).
De oplossing is om beide e-mailkolommen te wijzigen in een compatibele sortering, misschien het gemakkelijkst door ze identieke tekensets en sorteringen te maken.