Heim >Datenbank >MySQL-Tutorial >Warum ist meine MySQL-Abfrage mit einer Unterabfrage in WHERE IN so langsam?

Warum ist meine MySQL-Abfrage mit einer Unterabfrage in WHERE IN so langsam?

Linda Hamilton
Linda HamiltonOriginal
2024-11-15 15:54:03482Durchsuche

Why is My MySQL Query with a Subquery in WHERE IN So Slow?

MySQL-Leistungsverschlechterung mit Unterabfrage in WHERE IN

Beim Versuch, doppelte Zeilen in einer MySQL-Datenbank zu identifizieren und zu überprüfen, ergab sich eine scheinbar einfache Abfrage in unerwartet langsamer Leistung. Die ursprüngliche Abfrage, die alle Zeilen mit doppelten Werten in der Spalte „relevantes_Feld“ auswählen sollte, verwendete die folgende Struktur:

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

Diese Abfrage wurde schnell ausgeführt, aber als eine nachfolgende Abfrage erstellt wurde, um alle Zeilen abzurufen „some_table“ mit „relevant_field“-Werten, die mit denen in der ersten Abfrage übereinstimmen, sank die Leistung dramatisch.

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

Die langsame Leistung kann auf die Art der Unterabfrage als korrelierte Abfrage zurückgeführt werden. In diesem Fall wird die Unterabfrage für jede von der Hauptabfrage verarbeitete Zeile ausgeführt, was zu einem übermäßigen Overhead führt.

Um dieses Leistungsproblem zu mildern, ist es vorteilhaft, die korrelierte Unterabfrage durch Auswahl in eine nicht korrelierte Unterabfrage umzuwandeln alle Spalten aus der Unterabfrage.

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

Durch diese Änderung wird die Leistung der Hauptabfrage erheblich verbessert.

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 überarbeitete Abfrage nutzt die Optimierungsfunktionen von MySQL, um Duplikate effizient abzurufen Zeilen ohne die mit der ursprünglichen korrelierten Unterabfrage verbundenen Leistungseinbußen.

Das obige ist der detaillierte Inhalt vonWarum ist meine MySQL-Abfrage mit einer Unterabfrage in WHERE IN 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