MySQL – SELECT WHERE Field IN (Unterabfrage) Leistungsabfall
In einer Datenbank kann die Erkennung doppelter Zeilen mithilfe einer Unterabfrage ein effizienter Ansatz sein . Beim Versuch, alle Zeilen mit doppelten Feldwerten abzurufen, kann es jedoch bei der WHERE IN-Abfrage (Unterabfrage) zu erheblichen Leistungsproblemen kommen. Wenn Sie den Grund für diese Verlangsamung verstehen, können Sie die Abfrage optimieren.
Korrelierte Unterabfragen und ihre Auswirkungen
Der Grund für den Leistungsabfall in diesem Szenario liegt in der Verwendung von korrelierten Unterabfragen Unterabfragen. Eine korrelierte Unterabfrage referenziert Werte aus ihrer übergeordneten Abfrage, was bedeutet, dass die Unterabfrage einmal für jede Zeile ausgeführt wird, die in der übergeordneten Abfrage verarbeitet wird. In der bereitgestellten Abfrage:
SELECT * FROM some_table WHERE relevant_field IN ( SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1 )
Die Unterabfrage gibt doppelte Feldwerte in some_table zurück. Wenn die äußere Abfrage jede Zeile in „some_table“ verarbeitet, vergleicht sie den relevanten_Feldwert mit den von der Unterabfrage zurückgegebenen Werten. Da die Unterabfrage mehrere Zeilen für jeden doppelten Feldwert zurückgibt, erfordert dieser Vergleich die mehrfache Ausführung der Unterabfrage, was zu längeren Ausführungszeiten führt.
Adressierung korrelierter Unterabfragen
Zu überwinden Um das durch korrelierte Unterabfragen verursachte Leistungsproblem zu beseitigen, kann man die Unterabfrage in eine nicht korrelierte Abfrage umwandeln. Dies wird erreicht, indem alle Spalten in der Unterabfrage ausgewählt und dann als Tabelle in der äußeren Abfrage verwendet werden.
SELECT * FROM ( SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1 ) AS subquery
Durch die Auswahl aller Spalten in der Unterabfrage wird diese unabhängig von den Werten in der übergeordneten Abfrage und kann einmal ausgeführt werden, um alle doppelten Feldwerte zurückzugeben.
Geänderte Abfrage für verbesserte Leistung
Verwendung der Nicht korrelierte Unterabfrage, die modifizierte Abfrage, die alle doppelten Zeilen in some_table abruft und gleichzeitig Leistungsprobleme vermeidet, wird zu:
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 )
Dieser Ansatz optimiert die Abfrage effektiv, indem er die mit korrelierten Unterabfragen verbundenen Leistungsnachteile beseitigt. Die Abfrage kann jetzt doppelte Zeilen effizient abrufen und ermöglicht so die Überprüfung und Analyse potenzieller Datenanomalien.
Das obige ist der detaillierte Inhalt vonWarum führt die Verwendung von „WHERE IN (Subquery)' zu Leistungsproblemen in MySQL bei der Suche nach doppelten Zeilen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!