MySQL – Unterabfragekorrelation verlangsamt die Leistung von IN-Klauseln
Die angegebene Abfrage, die doppelte Zeilen in einer Datenbanktabelle mithilfe einer Unterabfrage in identifiziert In der IN-Klausel treten erhebliche Leistungsprobleme auf. Obwohl die Unterabfrage selbst schnell ausgeführt wird, dauert die Abfrage mit der IN-Klausel erheblich länger.
Grund für die Langsamkeit
Die Verlangsamung wird durch die korrelierte Natur der Unterabfrage verursacht. In einer korrelierten Abfrage referenziert die Unterabfrage Spalten der äußeren Abfrage und macht sie so von der Ausführung der äußeren Abfrage abhängig. Dadurch löst jede Zeile in der äußeren Tabelle eine separate Ausführung der Unterabfrage aus.
Lösung
Um das Problem zu beheben, kann die korrelierte Unterabfrage in eine umgewandelt werden nicht korrelierte Unterabfrage durch Auswahl aller darin enthaltenen Spalten. Dadurch wird die Abhängigkeit von der äußeren Abfrage eliminiert und die Leistung erheblich verbessert:
SELECT * FROM ( SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1 ) AS subquery
Endgültige Abfrage
Die geänderte Abfrage sieht folgendermaßen aus:
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 nicht korrelierte Abfrage wird viel schneller ausgeführt als die ursprüngliche korrelierte Abfrage.
Das obige ist der detaillierte Inhalt vonWarum verursacht meine MySQL-Unterabfrage in einer IN-Klausel Leistungsprobleme?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!