Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Por que LEFT JOIN é mais lento que INNER JOIN?


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.