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.