Les sous-requêtes avec EXISTE vs EN - MySQL

Ci-dessous deux requêtes sont des sous-requêtes. Les deux sont le même et les deux fonctionne très bien pour moi. Mais le problème, c'est la Méthode 1 de la requête prend environ 10 secondes pour exécuter tandis que la Méthode 2 de la requête prend moins de 1 sec.

J'ai été en mesure de convertir la méthode 1 de la requête à la méthode 2, mais je ne comprends pas ce qui se passe dans la requête. J'essaie de comprendre moi-même. J'aimerais vraiment savoir quelle est la différence entre ci-dessous deux requêtes et comment le gain de performance se produisent ? quelle est la logique derrière cela ?

Je suis nouveau sur ce advance techniques. J'espère que quelqu'un va m'aider ici. Étant donné que j'ai lu le docs qui ne me donne pas la moindre idée.

Méthode 1 :

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 :

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
         )                                             
   )
InformationsquelleAutor Techie | 2013-01-07