Heim >Datenbank >MySQL-Tutorial >Warum ist die Verwendung einer Unterabfrage in der WHERE-Klausel in MySQL so langsam?

Warum ist die Verwendung einer Unterabfrage in der WHERE-Klausel in MySQL so langsam?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-22 16:09:11683Durchsuche

Why Is Using a Subquery in the WHERE Clause So Slow in MySQL?

Auswirkungen auf die MySQL-Leistung: Unterabfrage in der WHERE-Klausel

Beim Umgang mit doppelten Daten ist es notwendig, die fehlerhaften Zeilen zu identifizieren und zu überprüfen. Allerdings kann eine einfache Abfrage mit einer Unterabfrage in der WHERE-Klausel zu erheblichen Leistungsproblemen führen.

Die ursprüngliche Abfrage:

SELECT *
FROM some_table 
WHERE relevant_field IN
(
    SELECT relevant_field
    FROM some_table
    GROUP BY relevant_field
    HAVING COUNT(*) > 1
)

Trotz des Index auf relevant_field, this Die Abfrage wird außergewöhnlich langsam ausgeführt. Der Grund liegt in der korrelierten Natur der Unterabfrage.

Korrelierte Unterabfragen und Leistung:

Eine korrelierte Unterabfrage ist eine, die auf Spalten der äußeren Abfrage verweist. In diesem Fall wählt die Unterabfrage die relevanten Feldwerte aus, die mehr als einmal in der Tabelle vorkommen. Für jede Zeile in der äußeren Abfrage wird die Unterabfrage ausgeführt, was zu mehreren Ausführungen derselben Abfrage führt. Dies führt zu einer schlechten Leistung.

Nicht korrelierte Unterabfragen als Lösung:

Um das Leistungsproblem zu beseitigen, wird empfohlen, die korrelierte Unterabfrage in eine nicht korrelierte umzuwandeln eins. Dies kann erreicht werden, indem alle Spalten aus der Unterabfrage ausgewählt und ihr ein Alias ​​zugewiesen wird.

SELECT * FROM
(
    SELECT relevant_field
    FROM some_table
    GROUP BY relevant_field
    HAVING COUNT(*) > 1
) AS subquery

Die geänderte Abfrage:

SELECT *
FROM some_table
WHERE relevant_field IN
(
    SELECT * FROM
    (
        SELECT relevant_field
        FROM some_table
        GROUP BY relevant_field
        HAVING COUNT(*) > 1
    ) AS subquery
)

Diese Abfrage wird viel schneller ausgeführt weil die Unterabfrage nicht mehr korreliert ist. Es berechnet die relevanten_Feldwerte, die mehr als einmal in einer einzelnen Ausführung vorkommen, und speichert sie im Unterabfrage-Alias, der dann in der Hauptabfrage verwendet wird.

Fazit:

Das Verständnis des Unterschieds zwischen korrelierten und nicht korrelierten Unterabfragen ist entscheidend für die Optimierung der MySQL-Leistung. Durch die Umwandlung korrelierter Unterabfragen in nicht korrelierte Unterabfragen können Sie die Geschwindigkeit von Abfragen, die auf Unterabfragen in der WHERE-Klausel basieren, erheblich verbessern.

Das obige ist der detaillierte Inhalt vonWarum ist die Verwendung einer Unterabfrage in der WHERE-Klausel in MySQL so langsam?. 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