Med INNER JOIN kommer MySQL i allmänhet att börja med tabellen med det minsta antalet rader. I det här fallet börjar den med tabellen finished
och söker efter motsvarande post i saved
med hjälp av indexet på saved.email
.
För en LEFT JOIN, (exklusive vissa optimeringar) ansluter MySQL i allmänhet posterna i ordning (börjar med tabellen längst till vänster). I det här fallet börjar MySQL med tabellen saved
, och försöker sedan hitta varje motsvarande post i finished
. Eftersom det inte finns någon användbar index på finished.email
måste den göra en fullständig genomsökning för varje uppslagning.
Redigera
Nu när du har lagt upp ditt schema kan jag se att MySQL ignorerar indexet (finished.email
) när du går från utf8
till latin1
teckenuppsättning. Du har inte lagt upp teckenuppsättningar och sammanställningar för varje kolumn, så jag använder standardteckenuppsättningen för tabellen. Kollationerna måste vara kompatibla för att MySQL ska kunna använda indexet.
MySQL kan tvinga fram (uppgradera) en latin1
sammanställning, som är mycket begränsad, upp till en utf8
sortering som unicode_ci
(så att den första frågan kan använda indexet på saved.email
genom att uppgradera latin1
sortering till utf8
), men motsatsen är inte sant (den andra frågan kan inte använda indexet på finished.email
eftersom den inte kan nedgradera en utf8
sortering ner till latin1
).
Lösningen är att ändra båda e-postkolumnerna till en kompatibel sortering, kanske enklast genom att göra dem till identiska teckenuppsättningar och sorteringar.