Maison > base de données > tutoriel mysql > Sous-requêtes EXISTS et IN : comment puis-je optimiser les performances de mes requêtes SQL ?

Sous-requêtes EXISTS et IN : comment puis-je optimiser les performances de mes requêtes SQL ?

Patricia Arquette
Libérer: 2025-01-03 01:23:39
original
534 Les gens l'ont consulté

EXISTS vs. IN Subqueries: How Can I Optimize My SQL Query Performance?

Sous-requêtes avec EXISTS vs IN : optimisation des performances

Lorsque vous travaillez avec des sous-requêtes, l'optimisation des performances est cruciale. Deux méthodes de sous-requête courantes sont EXISTS et IN, chacune ayant ses propres avantages et inconvénients. Dans cet article, nous explorerons les principales différences entre ces méthodes et démontrerons leur impact sur les performances.

Énoncé du problème

Les deux sous-requêtes suivantes sont sémantiquement équivalentes, mais la méthode 1 prend beaucoup plus de temps à exécuter que la méthode 2 :

Méthode 1 (en utilisant 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 (utilisation d'EXISTS)

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

Différences de performances

Par en analysant les plans d'explication, nous pouvons comprendre pourquoi la méthode 2 est plus rapide. La principale différence réside dans la façon dont ces méthodes gèrent la sous-requête :

  • IN: La sous-requête est évaluée plusieurs fois, une fois pour chaque ligne de la requête externe. En effet, IN effectue une analyse complète de la table de sous-requête pour chaque comparaison de lignes.
  • EXISTS : La sous-requête n'est évaluée qu'une seule fois, quel que soit le nombre de lignes dans la requête externe. En effet, EXISTS renvoie immédiatement vrai ou faux dès qu'une ligne correspondante est trouvée.

Avantages d'EXISTS

L'utilisation d'EXISTS offre plusieurs avantages par rapport à IN, surtout lorsqu'il s'agit de résultats de sous-requêtes volumineux :

  • Plus rapide Exécution : EXISTS peut être beaucoup plus rapide, car cela évite les analyses de table inutiles.
  • Simplicité : EXISTS est généralement plus facile à lire et à comprendre que IN, en particulier pour les sous-requêtes complexes.
  • Gestion de NULL : EXISTS peut mieux gérer les valeurs NULL que IN, en tant que NULL le résultat de la sous-requête est simplement évalué à faux.

Avantages de IN

Bien qu'EXISTS soit généralement plus performant, IN peut être préféré dans certains scénarios :

  • Résultats de petite sous-requête : Lorsque l'ensemble de résultats de sous-requête est petit, le La surcharge de performance de IN devient négligeable par rapport à EXISTS.
  • Exigences spécifiques : Dans certains cas rares, la sémantique de IN peut être nécessaire pour répondre à des exigences commerciales spécifiques.

Conclusion

Dans la plupart des cas, EXISTS est la méthode préférée pour les sous-requêtes en raison de ses performances avantages et gestion des valeurs NULL. Cependant, il est important de prendre en compte le cas d'utilisation spécifique et la taille de la sous-requête lors du choix entre EXISTS et IN afin d'optimiser les performances et l'efficacité des requêtes.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal