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!