Estou tentando comparar duas 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
Estou certo em dizer que essas duas consultas fornecem os mesmos resultados?
Além disso, é correto dizer que a primeira consulta cria uma tabela maior para a qual fazer uma WHERE
condição maior ; enquanto que no segundo caso, temos uma tabela construída menor à qual o simples WHERE
é então aplicado.
Supondo que os resultados sejam os mesmos, qual consulta deve ser preferida? Existe um problema de desempenho óbvio?
mysql
performance
Geoff
fonte
fonte
INNER JOIN
, mas com umLEFT JOIN
isso retornará resultados diferentes. Basicamente, as condições que você adicionou naWHERE
em sua segunda consulta estão convertendo o seuJOIN
em umINNER JOIN
INNER JOIN
fazer minhas perguntas sobre desempenho permanecerem válidas?ON
critérios de filtro eWHERE
.Respostas:
Se considerarmos que você usa em
INNER JOIN
vez deLEFT JOIN
(que parece ser sua intenção), essas duas consultas são funcionalmente equivalentes. Os otimizadores de consulta revisarão e avaliarão os critérios em suaWHERE
cláusula e suaFROM
cláusula e considerarão todos esses fatores ao criar planos de consulta para alcançar o plano de execução mais eficiente. Se fizermos umEXPLAIN
em ambas as instruções, obteremos o mesmo resultado:Consulta 1 :
[Resultados] :
Consulta 2 :
[Resultados] :
Você pode revisar os detalhes completos com os seguintes links. Também criei um exemplo do SQL 2008 para que você possa comparar como os dois mecanismos funcionam (que é o mesmo):
Exemplo de consulta MySQL
Exemplo de consulta do SQL 2008 (verifique 'Exibir plano de execução' para os dois resultados)
fonte
INNER JOIN
vez deLEFT JOIN
e recebo a mesma saída em um décimo do tempo. Acho que sei por que obtenho a mesma saída, mas por que umINNER JOIN
desempenho melhor?LEFT JOIN
é uma junção externa, ele não pode restringir o conjunto de dados no lado de retorno completo do conjunto e tentará recuperar todas as linhas dessa tabela (nesse caso, TabelaA). Se você usarINNER JOIN
, ele poderá aproveitar esse critério nas duas tabelas e restringir o conjunto de dados, proporcionando um retorno mais rápido.