Mysql
 sql >> Base de données >  >> RDS >> Mysql

Y a-t-il un problème avec les jointures qui n'utilisent pas le mot-clé JOIN dans SQL ou MySQL ?

Filtrage des jointures uniquement à l'aide de WHERE peut être extrêmement inefficace dans certains scénarios courants. Par exemple :

SELECT * FROM people p, companies c 
    WHERE p.companyID = c.id AND p.firstName = 'Daniel'

La plupart des bases de données exécuteront littéralement cette requête, en prenant d'abord le produit cartésien des people et companies tableaux et puis filtrage par ceux qui ont companyID correspondant et id des champs. Bien que le produit entièrement sans contrainte n'existe nulle part ailleurs qu'en mémoire et seulement pendant un moment, son calcul prend un certain temps.

Une meilleure approche consiste à regrouper les contraintes avec le JOIN s le cas échéant. Ce n'est pas seulement subjectivement plus facile à lire, mais aussi beaucoup plus efficace. Ainsi :

SELECT * FROM people p JOIN companies c ON p.companyID = c.id
    WHERE p.firstName = 'Daniel'

C'est un peu plus long, mais la base de données est capable de regarder le ON clause et l'utiliser pour calculer le JOIN entièrement contraint directement, plutôt que de commencer par tout puis en limitant. Ceci est plus rapide à calculer (en particulier avec de grands ensembles de données et/ou des jointures à plusieurs tables) et nécessite moins de mémoire.

Je change chaque requête que je vois qui utilise la "virgule JOIN " syntaxe. À mon avis, le seul but de son existence est la concision. Compte tenu de l'impact sur les performances, je ne pense pas que ce soit une raison impérieuse.