Heim >Datenbank >MySQL-Tutorial >Warum ist die „IN'-Bedingung von SQL manchmal langsamer als der „='-Operator?

Warum ist die „IN'-Bedingung von SQL manchmal langsamer als der „='-Operator?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-16 17:13:08162Durchsuche

Why is SQL's `IN` Condition Sometimes Slower Than the `=` Operator?

SQLs IN-Zustand: Leistungsprobleme im Vergleich zu =

In bestimmten Situationen kann die IN-Bedingung von SQL im Vergleich zum =-Operator eine deutlich schlechtere Leistung erbringen. Dies war ein bemerkenswertes Problem in älteren MySQL-Versionen, obwohl spätere Versionen (MySQL 5.6 und höher) dieses Problem behoben haben.

Der Leistungsunterschied ist auf Optimierungsherausforderungen zurückzuführen. Eine Unterabfrage innerhalb einer IN-Klausel wird möglicherweise fälschlicherweise als abhängig und nicht als unabhängig identifiziert. Dies führt dazu, dass die Unterabfrage für jede Zeile in der Hauptabfrage wiederholt ausgeführt wird, was sich dramatisch auf die Leistung auswirkt.

Sehen wir uns ein Beispiel an:

<code class="language-sql">SELECT * FROM question_law_version
WHERE question_law_id IN (
    SELECT MAX(foo_id)
    FROM bar
);</code>

Ein EXPLAIN Plan für diese Abfrage könnte Folgendes ergeben:

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

Beachten Sie die Bezeichnung „ABHÄNGIGE UNTERABFRAGE“. Die innere Abfrage wird wiederholt ausgeführt. Umschreiben der Abfrage jedoch mit = (vorausgesetzt, die Unterabfrage gibt einen einzelnen Wert zurück):

<code class="language-sql">SELECT * FROM question_law_version
WHERE question_law_id = (
    SELECT MAX(foo_id)
    FROM bar
);</code>

...führt oft zu einem effizienteren Plan:

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

Der Hauptunterschied ist die „SUBQUERY“-Klassifizierung, die eine einzelne Ausführung angibt. Diese Leistungsdiskrepanz ergibt sich aus der Fehlinterpretation der Unterabfrageabhängigkeit der IN-Klausel durch MySQL (in älteren Versionen). Die ineffiziente Handhabung dieses Problems durch die Datenbank führt zu einer Leistungsverlangsamung.

Das obige ist der detaillierte Inhalt vonWarum ist die „IN'-Bedingung von SQL manchmal langsamer als der „='-Operator?. 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