
Unterabfragen mit EXISTS vs. IN in MySQL: Leistungsoptimierung
Bei der Arbeit mit Unterabfragen in MySQL gibt es zwei gängige Ansätze: die Verwendung von IN Operator und Verwendung des EXISTS-Operators. Obwohl beide Methoden ähnliche Ergebnisse erzielen können, können sie erhebliche Leistungsunterschiede aufweisen.
Betrachten Sie die folgenden zwei Unterabfragebeispiele:
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
)
)Wie in der Problemstellung erwähnt, dauert die Ausführung von Methode 1 deutlich länger als Methode 2. Dies liegt an einem grundlegenden Unterschied in der Art und Weise, wie die beiden Ansätze mit der Unterabfrage umgehen.
IN-Operator:
Bei Verwendung des IN-Operators führt MySQL die Unterabfrage mehrmals einmal aus jede Zeile in der Hauptabfrage. In diesem Fall wird für jede Zeile in der Tracker-Tabelle die Unterabfrage ausgeführt, um zu ermitteln, ob sie die angegebenen Kriterien erfüllt. Dies kann zu einem erheblichen Leistungsaufwand führen, insbesondere wenn die Unterabfrage komplex ist oder eine große Datenmenge enthält.
EXISTS-Operator:
Im Gegensatz dazu der EXISTS-Operator führt die Unterabfrage nur einmal aus. Es prüft, ob es im Ergebnis der Unterabfrage mindestens eine passende Zeile für die aktuelle Zeile in der Hauptabfrage gibt. Bei einer Übereinstimmung wird die EXISTS-Bedingung als wahr ausgewertet; andernfalls ist es falsch. Dieser Ansatz ist viel effizienter, da er die Notwendigkeit vermeidet, alle Zeilen aus der Unterabfrage mehrmals abzurufen.
Wahl zwischen IN und EXISTS:
Im Allgemeinen ist dies der Fall Es wird empfohlen, wann immer möglich den EXISTS-Operator zu verwenden, da dieser in den meisten Fällen eine bessere Leistung bietet. Hier sind einige Richtlinien, die Ihnen helfen sollen, die richtige Wahl zu treffen:
Zusätzliche Überlegungen:
Das obige ist der detaillierte Inhalt vonMySQL-Unterabfragen: Wann sollte ich EXISTS vs. IN für optimale Leistung verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
Was ist eine ESD-Datei?
Was wird mit dem Artikel-Tag definiert?
So beheben Sie den Parsererror-Fehler
So lösen Sie das Problem, wenn der Computer eingeschaltet wird, der Bildschirm schwarz wird und der Desktop nicht aufgerufen werden kann
So konfigurieren Sie den virtuellen JSP-Speicherplatz
Vollständige Sammlung von SQL-Abfrageanweisungen
Was ist CSS?
Was ist Adobe Flash Player?