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

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

Patricia Arquette
Freigeben: 2025-01-16 17:18:12
Original
383 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren
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>
Nach dem Login kopieren
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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage