Heim >Datenbank >MySQL-Tutorial >Warum ist „IN' in MySQL-Abfragen langsamer als „=', selbst mit einem einzelnen Wert?
IN
vs. =
LeistungsdiskrepanzDas Problem: MySQL-Abfragen, die den IN
-Operator verwenden, können überraschend langsamer sein als solche, die den =
-Operator verwenden, selbst wenn IN
mit einem einzelnen Wert verglichen wird.
Grundursache: Das Problem liegt darin, wie MySQL Unterabfragen innerhalb von IN
-Klauseln verarbeitet. Ältere Versionen (vor 5.6) identifizieren diese Unterabfragen oft fälschlicherweise als abhängige Unterabfragen.
Abhängige vs. unabhängige Unterabfragen: Eine abhängige Unterabfrage wird für jede Zeile in der äußeren Abfrage erneut ausgeführt, was zu einem erheblichen Leistungsaufwand führt. Eine unabhängige Unterabfrage wird nur einmal ausgeführt. Frühere Versionen von MySQL behandelten IN
Unterabfragen fälschlicherweise als abhängig, selbst wenn sie einen einzelnen Wert zurückgaben.
EXPLAIN-Analyse: Der Befehl EXPLAIN
deckt dieses Verhalten auf. Eine IN
-Abfrage mit einer Unterabfrage zeigt „DEPENDENT SUBQUERY“ im Ausführungsplan an, während eine entsprechende Abfrage mit =
„SUBQUERY“ anzeigt.
Beispiel-EXPLAIN
-Ausgabe (zeigt das Problem):
<code>1 'PRIMARY' 'question_law_version' 'ALL' '' '' '' '' 10148 'Using where' 2 'DEPENDENT SUBQUERY' 'question_law_version' 'ALL' '' '' '' '' 10148 'Using where' 3 'DEPENDENT SUBQUERY' 'question_law' 'ALL' '' '' '' '' 10040 'Using where'</code>
Beispiel-EXPLAIN
-Ausgabe (nachdem das Problem mit =
behoben wurde):
<code>1 'PRIMARY' 'question_law_version' 'ALL' '' '' '' '' 10148 'Using where' 2 'SUBQUERY' 'question_law_version' 'ALL' '' '' '' '' 10148 'Using where' 3 'SUBQUERY' 'question_law' 'ALL' '' '' '' '' 10040 'Using where'</code>
Anschauliches Beispiel:
Diese einfache Abfrage veranschaulicht das Problem:
<code class="language-sql">SELECT id FROM foo WHERE id IN (SELECT MAX(foo_id) FROM bar);</code>
Selbst wenn ein einzelner Wert von der Unterabfrage zurückgegeben wird, wird er als abhängig behandelt, was zu einer langsamen Ausführung führt. Das Ersetzen von IN
durch =
verbessert die Leistung erheblich.
Lösung:
Das Leistungsproblem wurde in MySQL 5.6 und späteren Versionen behoben. Durch ein Upgrade auf eine neuere Version wird diese Diskrepanz behoben. Wenn ein Upgrade nicht möglich ist, kann das Umschreiben der Abfrage zur Vermeidung von IN
mit einer Unterabfrage (z. B. mithilfe von Joins) eine Problemumgehung sein.
Das obige ist der detaillierte Inhalt vonWarum ist „IN' in MySQL-Abfragen langsamer als „=', selbst mit einem einzelnen Wert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!