Maison > base de données > tutoriel mysql > Sous-requêtes MySQL : quand dois-je utiliser EXISTS ou IN pour des performances optimales ?

Sous-requêtes MySQL : quand dois-je utiliser EXISTS ou IN pour des performances optimales ?

DDD
Libérer: 2025-01-04 06:12:40
original
186 Les gens l'ont consulté

MySQL Subqueries: When Should I Use EXISTS vs. IN for Optimal Performance?

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 
         )
   )
Copier après la connexion

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
         )                                             
   )
Copier après la connexion

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 :

  • Utilisez EXISTS lorsque vous devez vérifier s'il existe une ligne correspondant à un certain critère.
  • Utilisez IN lorsque vous en avez besoin récupérer toutes les lignes qui correspondent à un certain critère.
  • Si le résultat de la sous-requête est très volumineux, EXISTS surpassera IN.
  • Si le résultat de la sous-requête est très petit, IN peut surpasser EXISTS.

Considérations supplémentaires :

  • Les valeurs nulles peuvent être un piège lors de l'utilisation de l'opérateur IN . Si la sous-requête renvoie Null, la condition IN entière sera évaluée à Null, affectant potentiellement les résultats de la requête principale.
  • EXISTS est plus polyvalent et peut gérer les cas où la sous-requête renvoie plusieurs lignes ou contient des fonctions d'agrégation.

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal