J'essaie de comparer deux requêtes:
Requête 1:
SELECT a,b,c,d,e
FROM tableA
LEFT JOIN tableB
ON tableA.a=tableB.a
WHERE tableA.b=tableB.b AND tableA.c=tableB.c AND tableA.d=tableB.d AND tableA.e=tableB.e
Requête 2:
SELECT a,b,c,d,e
FROM tableA
LEFT JOIN tableB
ON tableA.a=tableB.a AND tableA.b=tableB.b AND tableA.c=tableB.c AND tableA.d=tableB.d
WHERE tableA.e=tableB.e
Ai-je raison de dire que ces deux requêtes donnent les mêmes résultats?
De plus, est-il correct de dire que la première requête construit une table plus grande pour laquelle effectuer une WHERE
condition plus grande ; tandis que le deuxième cas, nous avons une table construite plus petite à laquelle le simple WHERE
est ensuite appliqué.
En supposant que les résultats sont les mêmes, quelle requête doit être préférée? Y a-t-il un problème de performance évident?
mysql
performance
Geoff
la source
la source
INNER JOIN
, mais avec unLEFT JOIN
cela retournera des résultats différents. Fondamentalement, les conditions que vous avez ajoutées sur leWHERE
sur votre deuxième requête convertissent votreJOIN
sur unINNER JOIN
INNER JOIN
que mes questions sur les performances restent valables?ON
et les critères de filtre dans leWHERE
.Réponses:
Si nous considérons que vous utilisez à la
INNER JOIN
place deLEFT JOIN
(ce qui semble être votre intention), ces deux requêtes sont fonctionnellement équivalentes. Les optimiseurs de requête examineront et évalueront les critères de votreWHERE
clause et de votreFROM
clause et prendront en compte tous ces facteurs lors de la création de plans de requête afin d'atteindre le plan d'exécution le plus efficace. Si nous faisons unEXPLAIN
sur les deux instructions, nous obtenons le même résultat:Requête 1 :
[Résultats] :
Requête 2 :
[Résultats] :
Vous pouvez consulter tous les détails avec les liens suivants. J'ai également créé un exemple SQL 2008 afin que vous puissiez comparer le fonctionnement des deux moteurs (qui est le même):
Exemple de requête MySQL
Exemple de requête SQL 2008 (assurez-vous de «Afficher le plan d'exécution» pour les deux résultats)
la source
INNER JOIN
au lieu deLEFT JOIN
et j'obtiens la même sortie dans un dixième du temps. Je pense que je sais pourquoi j'obtiens la même sortie, mais pourquoi aurait uneINNER JOIN
meilleure performance?LEFT JOIN
c'est une jointure externe, elle ne peut pas restreindre l'ensemble de données sur le côté retour complet de l'ensemble et essaiera de récupérer toutes les lignes de cette table (dans ce cas, TableA). Si vous utilisezINNER JOIN
, il peut tirer parti de ces critères sur les deux tables et restreindre l'ensemble de données, offrant ainsi un retour plus rapide.