Der Grund, warum der IN
-Operator langsamer ist als der =
-Operator in MySQL
In einigen Fällen werden IN
-Bedingungen in MySQL langsamer ausgeführt als =
-Bedingungen. Dies ist ein bekanntes Problem. Die Hauptursache liegt darin, dass der MySQL-Optimierer bei der Verarbeitung von Unterabfragen unter IN
-Bedingungen diese manchmal fälschlicherweise als abhängige Unterabfragen und nicht als unabhängige Unterabfragen identifiziert.
Daher wird die Unterabfrage in der Bedingung IN
einmal für jede Zeile in der übergeordneten Abfrage ausgeführt, während die Unterabfrage in der Bedingung =
nur einmal ausgeführt wird. Dies kann insbesondere bei der Arbeit mit großen Datenmengen zu erheblichen Leistungsunterschieden führen.
Sehen wir uns ein Beispiel für eine SELECT
-Abfrage an:
<code class="language-sql">SELECT * FROM question_law_version WHERE law_version IN (SELECT MAX(foo_id) FROM bar);</code>
Wenn Sie EXPLAIN
zur Analyse dieser Abfrage verwenden, könnten die Ergebnisse wie folgt aussehen:
<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>
"DEPENDENT SUBQUERY" gibt an, dass die Unterabfrage in der Bedingung IN
für jede Zeile der übergeordneten Abfrage ausgeführt wird.
Wenn wir die IN
-Bedingung in =
ändern:
<code class="language-sql">SELECT * FROM question_law_version WHERE law_version = (SELECT MAX(foo_id) FROM bar);</code>
EXPLAIN
wird zu:
<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>
Die Zeile „SUBQUERY“ gibt an, dass die Unterabfrage jetzt nur einmal ausgeführt wird, was zu einer schnelleren Ausführung führt.
Dieses Problem wurde in der MySQL 5.6.x-Version behoben. Wenn möglich, kann ein Upgrade auf eine neuere MySQL-Version dieses Problem beheben und zu Leistungsverbesserungen führen.
Das obige ist der detaillierte Inhalt vonWarum ist „IN' in MySQL-Unterabfragen langsamer als „='?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!