Dans MySQL, les sous-requêtes utilisant EXISTS et IN peuvent obtenir des résultats similaires, mais avec des implications contrastées en termes de performances. Cet article examine les différences entre ces techniques et explore leur impact sur les temps d'exécution des requêtes.
L'exemple fourni montre deux sous-requêtes qui produisent des résultats identiques en utilisant des approches différentes :
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 ) )
On observe que la méthode 1 (IN) nécessite environ 10 secondes pour l'exécution , tandis que la méthode 2 (EXISTS) se termine en moins d'une seconde. Cette disparité de performances substantielle mérite d'être explorée.
Un examen plus approfondi révèle que ces sous-requêtes utilisent différentes techniques pour identifier les lignes de la table de suivi qui satisfont à des conditions spécifiques.
Sous-requête IN (Méthode 1) : Cette sous-requête renvoie un ensemble d'identifiants de réservation qui répondent aux critères spécifiés. La requête externe vérifie ensuite si le booking_id de chaque ligne du tracker existe dans cet ensemble et renvoie les lignes qui correspondent.
Sous-requête EXISTS (méthode 2) : EXISTS détermine si des lignes dans le La table de suivi remplit les conditions spécifiées pour un booking_id donné. La requête externe évalue ensuite cette condition et renvoie les lignes pour lesquelles EXISTS renvoie vrai.
La différence de performances entre ces approches découle de leur logique sous-jacente et de leur efficacité :
Dans En général, EXISTS est l'approche préférée pour traiter des résultats de sous-requête volumineux et elle n'est pas sensible aux valeurs NULL dans la sous-requête. IN, en revanche, peut être plus efficace lorsque les résultats de la sous-requête sont relativement petits et que les valeurs NULL ne sont pas un problème.
Pour optimiser davantage les performances, il est recommandé de prendre en compte les éléments suivants :
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!