Con INNER JOIN, MySQL generalmente comenzará con la tabla con el menor número de filas. En este caso, comienza con la tabla finished
y busca el registro correspondiente en saved
usando el índice en saved.email
.
Para un LEFT JOIN, (excluyendo algunas optimizaciones) MySQL generalmente une los registros en orden (comenzando con la tabla más a la izquierda). En este caso, MySQL comienza con la tabla saved
, luego intenta encontrar cada registro correspondiente en finished
. Dado que no hay utilizable índice en finished.email
, debe realizar un análisis completo para cada búsqueda.
Editar
Ahora que publicaste tu esquema, puedo ver que MySQL está ignorando el índice (finished.email
) al pasar de utf8
a latin1
conjunto de caracteres. No ha publicado los juegos de caracteres y las intercalaciones para cada columna, así que usaré el juego de caracteres predeterminado para la tabla. Las colaciones deben ser compatibles para que MySQL use el índice.
MySQL puede forzar (actualizar) un latin1
intercalación, que es muy limitada, hasta un utf8
intercalación como unicode_ci
(para que la primera consulta pueda usar el índice en saved.email
actualizando latin1
colación a utf8
), pero lo contrario no es cierto (la segunda consulta no puede usar el índice en finished.email
ya que no puede degradar un utf8
intercalación hasta latin1
).
La solución es cambiar ambas columnas de correo electrónico a una intercalación compatible, tal vez más fácilmente haciéndolas intercalaciones y conjuntos de caracteres idénticos.