MySQL-Leistungsproblem: Leistungsanomalie bei Unterabfragen
Beim Versuch, doppelte Datensätze aus einer Datenbank abzurufen, verwendet eine SQL-Abfrage eine Unterabfrage, um die zu identifizieren Relevante Zeilen zeigten überraschende Leistungsunterschiede.
Die erste Abfrage isolierte effektiv doppelte Datensätze durch Gruppieren und Filtern auf einem bestimmten Feld, schnell ausgeführt. Allerdings wurde eine nachfolgende Abfrage, die alle Zeilen mit Werten abrufen wollte, die mit denen aus dem Duplikatsatz übereinstimmten (durch das Konstrukt WHERE ... IN (Unterabfrage) erreicht), übermäßig langsam.
Trotz der Existenz eines Indexes für Wenn Sie das entsprechende Feld eingeben, dauerte die Ausführung Minuten. Da Datenbankeinschränkungen vermutet wurden, wurde aus der Unterabfrage eine Ansicht erstellt und die übergeordnete Abfrage so geändert, dass sie stattdessen auf die Ansicht verweist. Dies führte zu einer nahezu sofortigen Ausführung.
Enthüllung des Übeltäters: Probleme mit korrelierten Abfragen
Bei der Untersuchung stellte sich heraus, dass die langsame Leistung auf die korrelierte Natur der zurückzuführen war Unterabfrage. In einer korrelierten Unterabfrage verweist die innere Abfrage auf ein Feld der äußeren Abfrage, was dazu führt, dass die Unterabfrage für jede Zeile in der äußeren Abfrage mehrmals ausgeführt wird, was zu einer verringerten Effizienz führt.
Behebung des Engpasses: Isolieren die Unterabfrage
Um die Leistungseinbußen zu mildern, wurde die korrelierte Unterabfrage durch Auswahl aller Spalten in eine nicht korrelierte Unterabfrage umgewandelt aus der Unterabfrage und weist ihr einen Alias zu. Dadurch wurde sichergestellt, dass die Unterabfrage nur einmal ausgeführt wurde, was die Abfrageleistung erheblich verbesserte.
Die geänderte übergeordnete Abfrage, die nun auf das nicht korrelierte Unterabfrageergebnis verweist, wurde mit der gewünschten Effizienz ausgeführt und das Leistungsproblem behoben.
Das obige ist der detaillierte Inhalt vonWarum ist meine WHERE IN-Abfrage (Unterabfrage) langsam, das Referenzieren einer Ansicht aus der Unterabfrage jedoch schnell?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!