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 ?

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 ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-17 16:41:14466parcourir

Subqueries vs. Joins: Why Did Replacing a Subquery with a Join Result in a 100x Performance Improvement?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn