web-dev-qa-db-fra.com

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

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, les deux inner join et left join donne le même résultat. Mais, j'ai encore quelques doutes qui ne se limitent pas à cette seule question.

  • quelle jointure est 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 lors de la demande d'adhésion?
  • Existe-t-il une relation entre la jointure interne et la jointure croisée?
10
ursitesion

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 n'avez probablement pas d'employés sans work_log (pas de lignes dans cette table), donc LEFT JOIN et JOIN seront équivalents dans les résultats. Cependant, si vous aviez une telle chose (un nouvel employé sans journal de travail enregistré), un JOIN wold omettrait cet employé, tandis qu'une jointure gauche (dont la première table est des employés) les afficherait tous, et serait nulle sur les champs de work_log s'il n'y a pas de correspondance.

Visual explanation of JOIN types

Encore une fois, les performances sont une chose secondaire pour interroger l'exactitude. Certaines personnes disent que vous ne devriez pas utiliser LEFT JOINs. 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é, n'utilisez pas LEFT JOIN si vous voulez vraiment dire INNER JOIN.

Dans MySQL CROSS JOIN, INNER JOIN et JOIN sont identiques. Dans la norme, et sémantiquement, un CROSS JOIN est un INNER JOIN sans clause ON, vous obtenez donc toutes les combinaisons de lignes entre les tables.

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

14
jynus

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, JOIN vs LEFT JOIN + WHERE clause à filtrer, sera la même chose. Optimisation vs 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.

0
Shim-Sao