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.
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 ) )
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 ) )
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.
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.
Der Leistungsunterschied zwischen diesen Ansätzen ergibt sich aus ihrer zugrunde liegenden Logik und Effizienz:
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:
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!