Com INNER JOIN, o MySQL geralmente começará com a tabela com o menor número de linhas. Neste caso, começa com a tabela
finished
e procura o registro correspondente em saved
usando o índice em saved.email
. Para um LEFT JOIN, (excluindo algumas otimizações) o MySQL geralmente une os registros em ordem (começando com a tabela mais à esquerda). Neste caso, o MySQL inicia com a tabela
saved
, então tenta encontrar cada registro correspondente em finished
. Como não há utilizável indexe em finished.email
, ele deve fazer uma varredura completa para cada pesquisa. Editar
Agora que você postou seu esquema, posso ver que o MySQL está ignorando o índice (
finished.email
) ao ir de utf8
para latin1
conjunto de caracteres. Você não postou os conjuntos de caracteres e agrupamentos para cada coluna, então vou usar o conjunto de caracteres padrão para a tabela. Os agrupamentos devem ser compatíveis para que o MySQL use o índice. MySQL pode coagir (atualizar) um
latin1
agrupamento, que é muito limitado, até um utf8
agrupamento como unicode_ci
(para que a primeira consulta possa usar o índice em saved.email
atualizando latin1
agrupamento para utf8
), mas o oposto não é verdadeiro (a segunda consulta não pode usar o índice em finished.email
já que não pode fazer downgrade de um utf8
agrupamento até latin1
). A solução é alterar ambas as colunas de e-mail para um agrupamento compatível, talvez mais facilmente, tornando-os conjuntos de caracteres e agrupamentos idênticos.