Heim >Datenbank >MySQL-Tutorial >Warum ist die Verwendung einer Unterabfrage in der WHERE-Klausel in MySQL so langsam?
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!