MySQL: qué combinación es mejor entre la combinación externa izquierda y la interna

10

¿Qué combinación tiene un mejor rendimiento si todos proporcionan el mismo resultado? Por ejemplo, tengo dos tablas employees(emp_id,name, address, designation, age, sex)y work_log(emp_id,date,hours_wored). Para obtener algunos resultados específicos tanto inner joiny left joinda el mismo resultado. Pero, todavía tengo algunas dudas que no se limitan solo a esta pregunta.

  • ¿Qué combinación es más eficiente que debería preferir en el caso de los mismos valores de resultado?
  • ¿Cuáles son otros factores que deben considerarse al momento de solicitar unirse?
  • ¿Hay alguna relación entre unión interna y unión cruzada?
ursitesion
fuente

Respuestas:

14

No hay un tipo de unión "mejor" o "peor". Tienen un significado diferente y deben usarse dependiendo de ello.

En su caso, es probable que no tiene empleados sin work_log (no hay filas de esa tabla), por lo que LEFT JOINy JOINserá equivalente en los resultados. Sin embargo, si tuviera tal cosa (un nuevo empleado sin registro de trabajo registrado), un usuario omitiría a JOINese empleado, mientras que una combinación izquierda (cuya primera tabla es empleados) los mostraría a todos, y nulos en los campos de work_log si hubiera No son partidos.

Explicación visual de los tipos JOIN

Nuevamente, el rendimiento es una cosa secundaria para la corrección de la consulta. Algunas personas dicen que no deberías usar LEFT JOINs. Es cierto que una IZQUIERDA IZQUIERDA obliga al optimizador a ejecutar la consulta en un orden particular, evitando algunas optimizaciones (reordenamiento de tablas) en algunos casos. Aquí hay un ejemplo . Pero no debe elegir uno sobre el otro si se sacrifica la corrección / significado, ya que una UNIÓN INTERNA no es inherentemente peor. El resto de las optimizaciones habituales se aplican como de costumbre.

En resumen, no lo use LEFT JOINsi realmente quiere decir INNER JOIN.

En MySQL CROSS JOIN, INNER JOINy JOINson lo mismo. En el estándar, y semánticamente, a CROSS JOINes un INNER JOINsin ONcláusula, por lo que obtiene todas las combinaciones de filas entre tablas.

Tienes ejemplos de todos los tipos semánticos de unión en Wikipedia . En la práctica, en MySQL, tendemos a escribir solo JOINy LEFT JOIN.

jynus
fuente
1
Gr8 explicación @jynus. Es una suerte que haya recibido la respuesta de mi pregunta solo de usted.
ursitesion
1 gráfico relevante es mejor que 1000 palabras. ¿Tú lo hiciste?
Fr0zenFyr
No, no lo hice, la atribución está en la parte inferior de la imagen codeproject.com/Articles/33052/… - Aunque usar diagramas de Venn para representar uniones es tan antiguo como su formalización algebraica: en.wikipedia.org/wiki/Relational_algebra
jynus
Comencé con un conjunto de comentarios y luego me di cuenta de que todo se reduce a: depende de su consulta. +1 de mi parte!
iheanyi
Y en aras de la integridad: en MySQL, la escritura JOINno calificada implicaINNER JOIN
Peter V. Mørch
0

¿Qué combinación tiene mejor rendimiento si todos proporcionan el mismo resultado?

Además de la respuesta anterior, por lo que sé, MySQL está optimizado para tener el mismo rendimiento.

Con buenos índices, por ejemplo, la cláusula JOINvs LEFT JOIN+ WHEREpara filtrar será lo mismo. La optimización frente a la lectura humana tiene sentido en consultas grandes con muchas combinaciones.

Usar buenos índices y caché es más importante.

Puede leer una buena explicación del proceso de optimización aquí:

El proceso de optimización de consultas : una consulta a menudo se puede ejecutar de muchas maneras diferentes y producir el mismo resultado. El trabajo del optimizador es encontrar la mejor opción.

Shim-Sao
fuente