Abfrageoptimierung: Die dramatischen Auswirkungen des Ersetzens von Unterabfragen durch Joins
Eine kürzlich durchgeführte Anwendungsumgestaltung verbesserte die Leistung erheblich, indem eine Unterabfrage durch einen Inner Join ersetzt wurde. Der ursprüngliche Code verwendete eine Unterabfrage in der WHERE
-Klausel:
<code class="language-sql">WHERE id IN (SELECT id FROM ...)</code>
Die Änderung führte zu einer atemberaubenden 100-fachen Beschleunigung, wodurch die Ausführungszeit von 50 Sekunden auf 0,3 Sekunden sank. Da stellt sich die Frage: Warum so ein gewaltiger Unterschied?
Der Schlüssel liegt im Verständnis des Unterabfrageverhaltens. Eine korrelierte Unterabfrage – bei der die WHERE
-Klausel der Unterabfrage von den Werten der äußeren Abfrage abhängt – wird für jede Zeile in der äußeren Abfrage wiederholt ausgeführt. Diese wiederholte Ausführung ist äußerst ineffizient. Im Gegensatz dazu wird eine nicht korrelierte Unterabfrage nur einmal ausgeführt.
Die ursprüngliche Unterabfrage wurde korreliert. Für jede verarbeitete Zeile musste die Datenbank die Unterabfrage ausführen, was zu zahlreichen Suchvorgängen führte.
Durch das Ersetzen der Unterabfrage durch einen Inner Join konnte die Datenbank Indexsuchen effizient nutzen. Die Join-Bedingung (z. B. submission_id = st_tag_id
) ermöglichte eine einzelne indizierte Suche pro qualifizierender Zeile. Dadurch wurden die Datenbankzugriffe drastisch reduziert, was den Leistungssprung erklärt.
Die Lektion? Für die Optimierung von SQL-Abfragen ist eine sorgfältige Abwägung von Unterabfragen im Vergleich zu Verknüpfungen von entscheidender Bedeutung. Durch das Verständnis korrelierter und nicht korrelierter Unterabfragen und ihrer Auswirkungen auf die Leistung können Entwickler wesentlich schnellere und effizientere Datenbankabfragen schreiben.
Das obige ist der detaillierte Inhalt vonUnterabfragen vs. Joins: Warum führte das Ersetzen einer Unterabfrage durch einen Join zu einer 100-fachen Leistungsverbesserung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!