sql >> Base de Datos >  >> RDS >> Mysql

¿Por qué LEFT JOIN es más lento que INNER JOIN?

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.