Qual junção tem melhor desempenho se todas elas fornecerem o mesmo resultado? Por exemplo, eu tenho duas tabelas employees(emp_id,name, address, designation, age, sex)
e work_log(emp_id,date,hours_wored)
. Para obter alguns resultados específicos tanto inner join
e left join
dá o mesmo resultado. Mas, ainda tenho algumas dúvidas que não se limitam apenas a esta questão.
- qual junção é mais eficiente, qual deve preferir no caso de valores de resultados iguais?
- Quais são os outros fatores que devem ser considerados no momento da aplicação da associação?
- Existe alguma relação entre junção interna e junção cruzada?
Não existe um tipo de junção "melhor" ou "pior". Eles têm significados diferentes e devem ser usados dependendo dele.
No seu caso, você provavelmente não tem funcionários sem
work_log
(nenhuma linha nessa tabela), entãoLEFT JOIN
eJOIN
serão equivalentes nos resultados. No entanto, se você tivesse uma coisa dessas (um novo funcionário sem registrowork_log
),JOIN
omitiria esse funcionário, enquanto uma junção à esquerda (cuja primeira tabela é funcionários) mostraria todos eles e nulos nos campos dework_log
se não houver fósforos.Imagem de CL Moffatt no Code Project
Novamente, o desempenho é uma coisa secundária para a correção da consulta. Algumas pessoas dizem que você não deve usar
LEFT JOIN
s. É verdade que aLEFT JOIN
força o otimizador a executar a consulta em uma determinada ordem, impedindo algumas otimizações (reordenação de tabelas) em alguns casos. Aqui está um exemplo . Mas você não deve escolher um sobre o outro se a correção/significado for sacrificado, poisINNER JOIN
não é inerentemente pior. O restante das otimizações usuais se aplica normalmente.Em resumo, não use
LEFT JOIN
se você realmente quer dizerINNER JOIN
.No MySQL
CROSS JOIN
,INNER JOIN
eJOIN
são os mesmos. No padrão, e semanticamente, aCROSS JOIN
é umINNER JOIN
semON
cláusula, então você obtém todas as combinações de linhas entre as tabelas.Você tem exemplos de todos os tipos semânticos de junção na Wikipedia . Na prática, no MySQL, tendemos a escrever apenas
JOIN
eLEFT JOIN
.Qual junção tem melhor desempenho se todas elas fornecerem o mesmo resultado?
Além da resposta anterior, pelo que sei, o MySQL é otimizado para ter o mesmo desempenho.
Com bons índices, por exemplo, cláusula
JOIN
vsLEFT JOIN
+WHERE
para filtrar, será a mesma coisa. Otimização versus leitura humana faz sentido em consultas grandes com muitas junções.Usar bons índices e cache é mais importante.
Você pode ler uma boa explicação do processo de otimização aqui:
O Processo de Otimização de Consulta : Uma consulta geralmente pode ser executada de muitas maneiras diferentes e produzir o mesmo resultado. O trabalho do otimizador é encontrar a melhor opção.
Não é o mesmo para mim, MySql 5.7 8 vCPU, 52 GB de RAM
A consulta a seguir leva cerca de 30 segundos, não sei por que
A tabela de transações possui 24.257.151 registros
A tabela de atividades possui 18.603.665 registros
A tabela de compras possui 13.911.705 registros
Todos os índices necessários estão em vigor
Após substituir a seguinte linha:
com LEFT JOIN
a mesma consulta leva ~0,046s
Explique antes:
Explique depois: