Estoy tratando de comparar dos consultas:
Consulta 1:
SELECT a,b,c,d,e
FROM tableA
LEFT JOIN tableB
ON tableA.a=tableB.a
WHERE tableA.b=tableB.b AND tableA.c=tableB.c AND tableA.d=tableB.d AND tableA.e=tableB.e
Consulta 2:
SELECT a,b,c,d,e
FROM tableA
LEFT JOIN tableB
ON tableA.a=tableB.a AND tableA.b=tableB.b AND tableA.c=tableB.c AND tableA.d=tableB.d
WHERE tableA.e=tableB.e
¿Tengo razón al decir que estas dos consultas dan los mismos resultados?
Además, ¿es correcto decir que la primera consulta crea una tabla más grande para la cual hacer una WHERE
condición más grande ? mientras que en el segundo caso tenemos una tabla construida más pequeña a la que WHERE
luego se aplica lo simple .
Suponiendo que los resultados son los mismos, ¿qué consulta debería preferirse? ¿Hay un problema de rendimiento obvio?
mysql
performance
Geoff
fuente
fuente
INNER JOIN
, pero con unLEFT JOIN
esto devolverá resultados diferentes. Básicamente, las condiciones que agregó enWHERE
su segunda consulta están convirtiendo suJOIN
en unINNER JOIN
INNER JOIN
que mis preguntas sobre el rendimiento sigan siendo válidas?ON
criterios de filtro y enWHERE
.Respuestas:
Si consideramos que usa en
INNER JOIN
lugar deLEFT JOIN
(lo cual parece ser su intención), estas dos consultas son funcionalmente equivalentes. Los optimizadores de consultas revisarán y evaluarán los criterios en suWHERE
cláusula y suFROM
cláusula y considerarán todos estos factores al crear planes de consulta para alcanzar el plan de ejecución más eficiente. Si hacemos unEXPLAIN
en ambas declaraciones, obtenemos el mismo resultado:Consulta 1 :
[Resultados] :
Consulta 2 :
[Resultados] :
Puede revisar los detalles completos con los siguientes enlaces. También creé un ejemplo de SQL 2008 para que pueda comparar cómo funcionan los dos motores (que es lo mismo):
Ejemplo de consulta MySQL
Ejemplo de consulta SQL 2008 (asegúrese de 'Ver plan de ejecución' para ambos resultados)
fuente
INNER JOIN
lugar deLEFT JOIN
y obtuve el mismo resultado en una décima parte del tiempo. Creo que sé por qué obtengo el mismo resultado, pero ¿por qué tendría unINNER JOIN
mejor rendimiento?LEFT JOIN
es una unión externa, no puede restringir el conjunto de datos en el lado de retorno completo del conjunto e intentará recuperar todas las filas de esa tabla (en este caso, Tabla A). Si lo usaINNER JOIN
, puede aprovechar ese criterio en ambas tablas y restringir el conjunto de datos, proporcionando así un retorno más rápido.