MySQL: quelle jointure est meilleure entre la jointure externe gauche et la jointure interne

10

Quelle jointure est la plus performante si toutes fournissent le même résultat? Par exemple, j'ai deux tables employees(emp_id,name, address, designation, age, sex)et work_log(emp_id,date,hours_wored). Pour obtenir des résultats spécifiques à la fois inner joinet left joindonne le même résultat. Mais, j'ai encore quelques doutes qui ne se limitent pas à cette seule question.

  • quelle jointure est la plus efficace qui devrait préférer en cas de mêmes valeurs de résultat?
  • Quels sont les autres facteurs qui doivent être pris en compte au moment de la demande d'adhésion?
  • Existe-t-il une relation entre la jointure interne et la jointure croisée?
ursitesion
la source

Réponses:

14

Il n'y a pas de type de jointure «meilleur» ou «pire». Ils ont une signification différente et doivent être utilisés en fonction de celle-ci.

Dans votre cas, vous ne probablement pas les employés sans work_log (aucune ligne dans cette table), donc LEFT JOINet JOINsera équivalent dans les résultats. Cependant, si vous aviez une telle chose (un nouvel employé sans journal de travail enregistré), un wold omettrait JOINcet employé, tandis qu'une jointure gauche (dont la première table est des employés) les afficherait tous, et des valeurs nulles dans les champs de work_log s'il y avait ne sont pas des correspondances.

Explication visuelle des types JOIN

Encore une fois, les performances sont une chose secondaire pour interroger l'exactitude. Certaines personnes disent que vous ne devriez pas utiliser LEFT JOINle par. Il est vrai qu'un LEFT JOIN force l'optimiseur à exécuter la requête dans un ordre particulier, empêchant certaines optimisations (réorganisation des tables) dans certains cas. Voici un exemple . Mais vous ne devez pas choisir l'un plutôt que l'autre si l'exactitude / la signification est sacrifiée, car une INNER JOIN n'est pas intrinsèquement pire. Le reste des optimisations habituelles s'appliquent comme d'habitude.

En résumé, ne l'utilisez pas LEFT JOINsi vous voulez vraiment dire INNER JOIN.

Dans MySQL CROSS JOIN, INNER JOINet JOINsont les mêmes. Dans la norme et sémantiquement, a CROSS JOINest un INNER JOINsans ONclause, vous obtenez donc toutes les combinaisons de lignes entre les tables.

Vous avez des exemples de tous les types de jointures sémantiques sur Wikipédia . En pratique, dans MySQL, nous avons tendance à écrire uniquement JOINet LEFT JOIN.

jynus
la source
1
Explication de Gr8 @jynus. Il est heureux que je ne reçoive de réponse à ma question que de vous.
ursitesion
Un graphique pertinent vaut mieux que 1000 mots. Est-ce que tu l'as fait?
Fr0zenFyr
Non, je ne l'ai pas fait, l'attribution est en bas de l'image codeproject.com/Articles/33052/… - Bien que l'utilisation de diagrammes venn pour représenter des jointures soit aussi ancienne que sa formalisation algébrique: en.wikipedia.org/wiki/Relational_algebra
jynus
J'ai commencé sur un ensemble de commentaires, puis j'ai réalisé que tout se résume à - cela dépend de votre requête. +1 de moi!
iheanyi
Et par souci d'exhaustivité: dans MySQL, l'écriture JOINsans réserve impliqueINNER JOIN
Peter V. Mørch
0

Quelle jointure est plus performante si toutes fournissent le même résultat?

J'ajoute la réponse précédente, pour ce que je sais, MySQL est optimisé pour avoir les mêmes performances.

Avec de bons index, par exemple, la clause JOINvs LEFT JOIN+ WHEREà filtrer, ce sera la même chose. L'optimisation par rapport à la lecture humaine prend tout son sens sur les grandes requêtes avec beaucoup de jointures.

L'utilisation de bons index et d'un bon cache est plus importante.

Vous pouvez lire une bonne explication du processus d'optimisation ici:

Le processus d'optimisation des requêtes : une requête peut souvent être exécutée de différentes manières et produire le même résultat. Le travail de l'optimiseur consiste à trouver la meilleure option.

Shim-Sao
la source