MySQL: Qual junção é melhor entre junção externa esquerda e junção interna

10

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). Obter alguns resultados específicos inner joine obter left joino mesmo resultado. Mas ainda tenho algumas dúvidas que não se limitam apenas a esta questão.

  • qual união é mais eficiente e qual deve ser preferida no caso dos mesmos valores de resultado?
  • Quais são outros fatores que devem ser considerados no momento da aplicação da junção?
  • Existe alguma relação entre junção interna e junção cruzada?
ursitesion
fonte

Respostas:

14

Não existe um tipo de associação "melhor" ou "pior". Eles têm um significado diferente e devem ser usados ​​dependendo dele.

No seu caso, você provavelmente não tem empregados sem work_log (há carreiras em que a tabela), então LEFT JOINe JOINserá equivalente no resultado. No entanto, se você tivesse uma dessas coisas (um novo funcionário sem work_log registrado), um número JOINomitido seria esse funcionário, enquanto uma junção esquerda (cuja primeira tabela é funcionários) mostraria todos eles e nulos nos campos de work_log, se houver não são correspondências.

Explicação visual dos tipos JOIN

Novamente, o desempenho é uma coisa secundária para consultar a correção. Algumas pessoas dizem que você não deve usar LEFT JOINs. É verdade que um LEFT JOIN força o otimizador a executar a consulta em uma ordem específica, 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, pois uma INNER JOIN não é inerentemente pior. O restante das otimizações usuais se aplica como de costume.

Em resumo, não use LEFT JOINse você realmente quer dizer INNER JOIN.

No MySQL CROSS JOIN, INNER JOINe JOINsão os mesmos. No padrão e semântica, a CROSS JOINé INNER JOINuma ONcláusula sem , portanto você obtém todas as combinações de linhas entre tabelas.

Você tem exemplos de todos os tipos semânticos de junção na Wikipedia . Na prática, no MySQL, tendemos apenas a escrever JOINe LEFT JOIN.

jynus
fonte
11
Gr8 explicação @jynus. É uma sorte que eu tenha a resposta da minha pergunta apenas de você.
precisa saber é o seguinte
1 gráfico relevante é melhor que 1000 palavras. Você fez isso?
Fr0zenFyr
Não, a atribuição está na parte inferior da imagem codeproject.com/Articles/33052/… - Embora o uso de diagramas de venn para representar junções seja tão antigo quanto sua formalização algébrica: en.wikipedia.org/wiki/Relational_algebra
jynus 9/07
Comecei com um conjunto de comentários e percebi que tudo se resume a - depende da sua consulta. +1 de mim!
Iheanyi
E por uma questão de exaustividade: No MySQL escrever JOINsem ressalvas implicaINNER JOIN
Peter V. Mørch
0

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, a cláusula JOINvs LEFT JOIN+ WHEREpara filtrar, será a mesma coisa. Otimização versus leitura humana fazem 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 várias maneiras diferentes e produzir o mesmo resultado. O trabalho do otimizador é encontrar a melhor opção.

Shim-Sao
fonte