Heim > Datenbank > MySQL-Tutorial > Warum ist der „IN'-Operator von MySQL selbst bei einem einzelnen Wert langsamer als „='?

Warum ist der „IN'-Operator von MySQL selbst bei einem einzelnen Wert langsamer als „='?

Linda Hamilton
Freigeben: 2025-01-16 17:38:11
Original
967 Leute haben es durchsucht

Why is MySQL's `IN` operator slower than `=` even with a single value?

Ausnahme bei der MySQL-Abfrageleistung: Leistungsunterschied zwischen IN-Operator und Gleichheitszeichenoperator

Problembeschreibung

In MySQL ist die Leistung einer SELECT-Abfrage mit der IN-Bedingung deutlich geringer als die Leistung derselben Abfrage mit dem Gleichheitszeichenoperator (=). Selbst wenn die IN-Bedingung nur einen einzigen Wert enthält, kann der Leistungsunterschied erheblich sein.

Erklärung

Dieses Problem ist auf einen Optimierungsfehler in MySQL zurückzuführen, der in MySQL 5.6.x behoben wurde. Dieses Problem tritt auf, wenn eine Unterabfrage, die eine IN-Bedingung enthält, fälschlicherweise als abhängige Unterabfrage und nicht als unabhängige Unterabfrage klassifiziert wird.

Abhängige Unterabfrage und unabhängige Unterabfrage

  • Abhängige Unterabfrage: Für jede Zeile in der äußeren Abfrage wird die abhängige Unterabfrage einmal ausgeführt, was zu mehreren Berechnungen führt.
  • Unabhängige Unterabfrage: wird nur einmal ausgeführt, unabhängig von der Anzahl der Zeilen in der äußeren Abfrage.

Beispielabfrageanalyse

Die folgende Beispielabfrage veranschaulicht diese Anomalie:

<code class="language-sql">SELECT *
FROM question_law_version
WHERE id IN (
    SELECT MAX(foo_id)
    FROM bar
)</code>
Nach dem Login kopieren

Beim Ausführen dieser Abfrage wird die Unterabfrage als abhängige Unterabfrage behandelt, was zu einer schlechten Leistung führt. Das Ersetzen von IN durch = beseitigt jedoch die Abhängigkeit und verbessert die Leistung erheblich.

Abfrageplanvergleich

Eine Untersuchung des Abfrageplans mit dem EXPLAIN-Befehl zeigt den Unterschied:

  • IN Zustand:
    • 'PRIMARY' 'question_law_version' 'ALL' '' '' '' '' 10148 'Verwendet wo'
    • 'ABHÄNGIGE UNTERABFRAGE' 'question_law_version' 'ALL' '' '' '' '' 10148 'Verwendet wo'
    • 'ABHÄNGIGE UNTERABFRAGE' 'question_law' 'ALL' '' '' '' '' 10040 'Verwendet wo'
  • Gleichheitszeichenbedingung:
    • 'PRIMARY' 'question_law_version' 'ALL' '' '' '' '' 10148 'Verwendet wo'
    • 'SUBQUERY' 'question_law_version' 'ALL' '' '' '' '' 10148 'Verwendet wo'
    • 'SUBQUERY' 'question_law' 'ALL' '' '' '' '' 10040 'Verwendet wo'

Bitte beachten Sie, dass es im Abfrageplan, der den =-Operator verwendet, keine „ABHÄNGIGE UNTERABFRAGE“ gibt.

Das obige ist der detaillierte Inhalt vonWarum ist der „IN'-Operator von MySQL selbst bei einem einzelnen Wert 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