С INNER JOIN MySQL обикновено започва с таблицата с най-малък брой редове. В този случай тя започва с таблица finished
и прави търсене на съответния запис в saved
използвайки индекса на saved.email
.
За LEFT JOIN (с изключение на някои оптимизации) MySQL обикновено обединява записите по ред (започвайки от най-лявата таблица). В този случай MySQL започва с таблицата saved
, след което се опитва да намери всеки съответен запис в finished
. Тъй като няма използваемен индекс на finished.email
, той трябва да извърши пълно сканиране за всяко търсене.
Редактиране
Сега, когато публикувахте своята схема, виждам, че MySQL игнорира индекса (finished.email
) при преминаване от utf8
на latin1
набор от символи. Не сте публикували наборите от знаци и съпоставянията за всяка колона, така че ще използвам набора от символи по подразбиране за таблицата. Съпоставянията трябва да са съвместими, за да може MySQL да използва индекса.
MySQL може да принуди (надгражда) latin1
съпоставяне, което е много ограничено, до utf8
съпоставяне като unicode_ci
(така че първата заявка може да използва индекса на saved.email
чрез надграждане на latin1
съпоставяне към utf8
), но обратното не е вярно (втората заявка не може да използва индекса на finished.email
тъй като не може да понижи utf8
съпоставяне до latin1
).
Решението е да промените и двете колони на имейла на съвместимо съпоставяне, може би най-лесно, като ги направите идентични набори от знаци и съпоставяния.