Heim > Datenbank > MySQL-Tutorial > EXISTS vs. IN in MySQL-Unterabfragen: Was ist leistungsfähiger?

EXISTS vs. IN in MySQL-Unterabfragen: Was ist leistungsfähiger?

DDD
Freigeben: 2025-01-03 16:11:43
Original
839 Leute haben es durchsucht

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

Unterabfrageoptimierung: EXISTS vs. IN in MySQL

In MySQL können Unterabfragen, die EXISTS und IN verwenden, ähnliche Ergebnisse erzielen, jedoch mit unterschiedlichen Auswirkungen auf die Leistung. In diesem Artikel werden die Unterschiede zwischen diesen Techniken untersucht und ihre Auswirkungen auf die Ausführungszeiten von Abfragen untersucht.

Leistungsvergleichsabfrage

Das bereitgestellte Beispiel zeigt zwei Unterabfragen, die mit unterschiedlichen Ansätzen identische Ergebnisse liefern:

Methode 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 
         )
   )
Nach dem Login kopieren

Methode 2 (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
        )                                             
    )
Nach dem Login kopieren

Es wird beobachtet, dass Methode 1 (IN) etwa 10 Sekunden für die Ausführung benötigt, während Methode 2 (EXISTS) in weniger als einer Sekunde abgeschlossen ist. Dieser erhebliche Leistungsunterschied erfordert eine Untersuchung.

Verhalten von Unterabfragen

Eine genauere Untersuchung zeigt, dass diese Unterabfragen unterschiedliche Techniken verwenden, um Zeilen in der Tracker-Tabelle zu identifizieren, die bestimmte Bedingungen erfüllen.

IN-Unterabfrage (Methode 1): Diese Unterabfrage gibt einen Satz von Reservierungs-IDs zurück, die den angegebenen Anforderungen entsprechen Kriterien. Die äußere Abfrage prüft dann, ob die Reservierungs-ID für jede Zeile im Tracker in diesem Satz vorhanden ist, und gibt übereinstimmende Zeilen zurück.

EXISTS-Unterabfrage (Methode 2): EXISTS bestimmt, ob Zeilen in der Die Tracker-Tabelle erfüllt die angegebenen Bedingungen für eine bestimmte Reservierungs-ID. Die äußere Abfrage wertet dann diese Bedingung aus und gibt Zeilen zurück, für die EXISTS „true“ zurückgibt.

Leistungsüberlegungen

Der Leistungsunterschied zwischen diesen Ansätzen ergibt sich aus ihrer zugrunde liegenden Logik und Effizienz:

  • EXISTS: EXISTS führt eine Reihe von Gruppierungsvorgängen durch, um festzustellen, ob Zeilen die Bedingung erfüllen. Dieser Ansatz ist effizienter, wenn die Anzahl der Zeilen in der Tracker-Tabelle groß ist.
  • IN: IN vergleicht jede Reservierungs-ID in der Tracker-Tabelle mit dem von der Unterabfrage zurückgegebenen Satz, der rechnerisch ist teurer, insbesondere wenn die Unterabfrage eine große Anzahl zurückgibt Zeilen.

Fazit

Im Allgemeinen ist EXISTS der bevorzugte Ansatz beim Umgang mit großen Unterabfrageergebnissen und reagiert nicht auf NULL-Werte in der Unterabfrage. IN hingegen kann effizienter sein, wenn die Ergebnisse der Unterabfrage relativ klein sind und NULL-Werte kein Problem darstellen.

Um die Leistung weiter zu optimieren, wird empfohlen, Folgendes zu berücksichtigen:

  • Verwenden Sie geeignete Indizes: Stellen Sie sicher, dass die Spalte „reservation_id“ in der Tracker-Tabelle einen Index für „Effizient“ hat Suchvorgänge.
  • Begrenzen Sie die Ergebnisse der Unterabfrage: Reduzieren Sie die Anzahl der von der Unterabfrage zurückgegebenen Zeilen mithilfe von Techniken wie LIMIT- oder WHERE-Filterung.

Das obige ist der detaillierte Inhalt vonEXISTS vs. IN in MySQL-Unterabfragen: Was ist leistungsfähiger?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage