Maison >base de données >tutoriel mysql >Sous-requêtes et jointures : pourquoi le remplacement d'une sous-requête par une jointure a-t-il entraîné une amélioration des performances par 100 ?
Optimisation des requêtes : l'impact dramatique du remplacement des sous-requêtes par des jointures
Une récente refactorisation d'application a considérablement amélioré les performances en remplaçant une sous-requête par une jointure interne. Le code d'origine utilisait une sous-requête dans la clause WHERE
:
<code class="language-sql">WHERE id IN (SELECT id FROM ...)</code>
Le changement a entraîné une accélération étonnante de 100x, réduisant le temps d'exécution de 50 secondes à 0,3 seconde. Cela soulève la question : pourquoi une telle différence ?
La clé réside dans la compréhension du comportement des sous-requêtes. Une sous-requête corrélée (où la clause WHERE
de la sous-requête dépend des valeurs de la requête externe) s'exécute de manière répétée pour chaque ligne de la requête externe. Cette exécution répétée est extrêmement inefficace. En revanche, une sous-requête non corrélée ne s'exécute qu'une seule fois.
La sous-requête d'origine a été corrélée. Pour chaque ligne traitée, la base de données devait exécuter la sous-requête, entraînant de nombreuses recherches.
Le remplacement de la sous-requête par une jointure interne a permis à la base de données d'exploiter efficacement les recherches d'index. La condition de jointure (par exemple, submission_id = st_tag_id
) autorisait une seule recherche indexée par ligne qualifiante. Cela a considérablement réduit les accès aux bases de données, expliquant le saut de performances.
La leçon ? Un examen attentif des sous-requêtes et des jointures est essentiel pour l'optimisation des requêtes SQL. Comprendre les sous-requêtes corrélées et non corrélées, ainsi que leurs implications en termes de performances, permet aux développeurs d'écrire des requêtes de base de données beaucoup plus rapides et plus efficaces.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!