Heim > Datenbank > MySQL-Tutorial > Hauptteil

Warum ist meine WHERE IN-Abfrage (Unterabfrage) langsam, das Referenzieren einer Ansicht aus der Unterabfrage jedoch schnell?

DDD
Freigeben: 2024-11-19 21:40:03
Original
456 Leute haben es durchsucht

Why is my WHERE IN (subquery) query slow, but referencing a view from the subquery is fast?

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage