J'ai remanié une section lente d'une application que nous avons héritée d'une autre entreprise pour utiliser une jointure interne au lieu d'une sous-requête :
WHERE id IN (SELECT id FROM ...)
La requête remaniée est environ 100 fois plus rapide. (~50 secondes à ~0,3) Je m'attendais à une amélioration, mais quelqu'un peut-il expliquer pourquoi elle est si radicale ? Les colonnes utilisées dans la clause where étaient toutes indexées. Est-ce que SQL exécute la requête dans la clause where une fois par ligne ou quelque chose comme ça ?
Mise à jour - Expliquez les résultats :
La différence se situe dans la deuxième partie de la requête "where id in ()" -
2 DEPENDENT SUBQUERY submission_tags ref st_tag_id st_tag_id 4 const 2966 Using where
contre 1 ligne indexée avec la jointure :
SIMPLE s eq_ref PRIMARY PRIMARY 4 newsladder_production.st.submission_id 1 Using index
4 votes
Duplicata possible de Jointure et sous-requête
2 votes
Pas un doublon. Cette question porte spécifiquement sur la différence de performance frappante. L'autre question est plus générale, ouverte sur les avantages et les inconvénients de chaque approche et sur les raisons pour lesquelles une approche semble plus populaire.
0 votes
@simhumileco Ce n'est pas une amélioration, ce n'est pas une différence, c'est contraire à ce que l'auteur a écrit & ce genre d'édition pour le style du code est inapproprié. Quand dois-je modifier le code ?
0 votes
Salut @philipxy, je n'avais pas l'intention d'interférer dans la pensée de l'auteur, mais seulement de rendre le fragment de code plus lisible et écrit avec plus de soin.