Maison > base de données > tutoriel mysql > EXISTS vs IN dans les sous-requêtes MySQL : laquelle est la plus performante ?

EXISTS vs IN dans les sous-requêtes MySQL : laquelle est la plus performante ?

DDD
Libérer: 2025-01-03 16:11:43
original
875 Les gens l'ont consulté

EXISTS vs. IN in MySQL Subqueries: Which is More Performant?

Optimisation des sous-requêtes : EXISTS vs IN dans MySQL

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.

Requête de comparaison des performances

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 
         )
   )
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

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.

Comportement des sous-requêtes

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.

Considérations sur les performances

La différence de performances entre ces approches découle de leur logique sous-jacente et de leur efficacité :

  • EXISTS : EXISTS effectue une série d'opérations de regroupement pour déterminer si des lignes remplissent la condition. Cette approche est plus efficace lorsque le nombre de lignes dans la table de suivi est grand.
  • IN : IN compare chaque réservation_id de la table de suivi à l'ensemble renvoyé par la sous-requête, qui est informatiquement plus cher, surtout lorsque la sous-requête renvoie un grand nombre de lignes.

Conclusion

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 :

  • Utilisez les index appropriés : assurez-vous que la colonne booking_id dans la table de suivi a un index pour une utilisation efficace. recherches.
  • Limiter les résultats de la sous-requête : réduisez le nombre de lignes renvoyées par la sous-requête à l'aide de techniques telles que le filtrage LIMIT ou WHERE.

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