Heim >Datenbank >MySQL-Tutorial >Warum ist „IN' in MySQL-Unterabfragen langsamer als „='?

Warum ist „IN' in MySQL-Unterabfragen langsamer als „='?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-16 17:18:12443Durchsuche

Why is `IN` slower than `=` in MySQL subqueries?

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>
Die Zeile

"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>
Die Ausgabe von

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!

Stellungnahme:
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