Sous-requêtes avec EXISTS vs IN dans MySQL : optimisation des performances
Lorsque vous travaillez avec des sous-requêtes dans MySQL, il existe deux approches courantes : utiliser l'IN et en utilisant l'opérateur EXISTS. Bien que les deux méthodes puissent obtenir des résultats similaires, elles peuvent présenter des différences de performances significatives.
Considérez les deux exemples de sous-requête suivants :
Méthode 1 (IN) :
SELECT * FROM tracker WHERE reservation_id IN ( SELECT reservation_id FROM tracker GROUP BY reservation_id HAVING ( method = 1 AND type = 0 AND Count(*) > 1 ) OR ( method = 1 AND type = 1 AND Count(*) > 1 ) OR ( method = 2 AND type = 2 AND Count(*) > 0 ) OR ( method = 3 AND type = 0 AND Count(*) > 0 ) OR ( method = 3 AND type = 1 AND Count(*) > 1 ) OR ( method = 3 AND type = 3 AND Count(*) > 0 ) )
Méthode 2 (EXISTE) :
SELECT * FROM `tracker` t WHERE EXISTS ( SELECT reservation_id FROM `tracker` t3 WHERE t3.reservation_id = t.reservation_id GROUP BY reservation_id HAVING ( METHOD = 1 AND TYPE = 0 AND COUNT(*) > 1 ) OR ( METHOD = 1 AND TYPE = 1 AND COUNT(*) > 1 ) OR ( METHOD = 2 AND TYPE = 2 AND COUNT(*) > 0 ) OR ( METHOD = 3 AND TYPE = 0 AND COUNT(*) > 0 ) OR ( METHOD = 3 AND TYPE = 1 AND COUNT(*) > 1 ) OR ( METHOD = 3 AND TYPE = 3 AND COUNT(*) > 0 ) )
Comme mentionné dans l'énoncé du problème, la méthode 1 prend beaucoup plus de temps à s'exécuter que la méthode 2. Cela est dû à une différence fondamentale dans la façon dont les deux approches gèrent la sous-requête.
Opérateur IN :
Lors de l'utilisation de l'opérateur IN, MySQL exécute la sous-requête plusieurs fois, une fois pour chaque ligne de la requête principale. Dans ce cas, pour chaque ligne de la table de suivi, la sous-requête est exécutée pour déterminer si elle répond aux critères spécifiés. Cela peut entraîner une surcharge de performances importante, surtout si la sous-requête est complexe ou contient une grande quantité de données.
Opérateur EXISTS :
En revanche, l'opérateur EXISTS exécute la sous-requête une seule fois. Il vérifie s'il existe au moins une ligne correspondante dans le résultat de la sous-requête pour la ligne actuelle de la requête principale. S'il y a une correspondance, la condition EXISTS est évaluée comme vraie ; sinon, c'est faux. Cette approche est beaucoup plus efficace car elle évite d'avoir à récupérer plusieurs fois toutes les lignes de la sous-requête.
Choisir entre IN et EXISTS :
Généralement, il est Il est recommandé d'utiliser l'opérateur EXISTS autant que possible, car il offre de meilleures performances dans la plupart des cas. Voici quelques lignes directrices pour vous aider à faire le bon choix :
Considérations supplémentaires :
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!