Leistungsunterschied zwischen Unterabfragen und expliziten Wert-IN-Abfragen
Warum ist eine MySQL-IN-Abfrage bei Verwendung einer Unterabfrage deutlich langsamer als bei der Verwendung expliziter Werte?
Bedenken Sie die folgende Abfrage:
<code class="sql">SELECT COUNT(DISTINCT subscriberid) FROM em_link_data WHERE linkid IN (SELECT l.id FROM em_link l WHERE l.campaignid = '2900' AND l.link != 'open')</code>
Die Ausführung dieser Abfrage dauert etwa 18 Sekunden, obwohl die Unterabfrage allein in weniger als 1 ms abgeschlossen ist.
Wenn die Unterabfrage jedoch durch explizite Werte ersetzt wird:
<code class="sql">SELECT COUNT(DISTINCT subscriberid) FROM em_link_data WHERE linkid IN (24899,24900,24901,24902);</code>
Die Abfrage wird in weniger als 1 Millisekunde abgeschlossen.
Erklärung
Die Leistungsdiskrepanz ergibt sich aus der Art und Weise, wie MySQL Unterabfragen auswertet. Unterabfragen werden jedes Mal ausgeführt, wenn sie angetroffen werden, was bedeutet, dass MySQL in der ersten Abfrage im Wesentlichen sieben Millionen Abfragen ausführt (Unterabfrageauswertung für jede Zeile in der Tabelle „em_link_data“). Im Gegensatz dazu wird die Unterabfrage bei der Verwendung expliziter Werte nur einmal ausgewertet.
Problemumgehung
Wenn das Umschreiben der Abfrage mithilfe eines JOINs keine Option ist, können Sie die Verwendung in Betracht ziehen einen Abfrage-Cache zur Verbesserung der Leistung. Der Abfragecache speichert die Ergebnisse zuvor ausgeführter Abfragen und verwendet sie wieder, wenn dieselbe Abfrage erneut ausgeführt wird. Dies kann die Ausführungszeit unterabfrageintensiver Abfragen erheblich verkürzen.
Um den Abfragecache zu aktivieren, fügen Sie die folgende Zeile zu Ihrer MySQL-Konfigurationsdatei hinzu:
query_cache_type = 1
Starten Sie MySQL neu, damit die Änderungen übernommen werden wirksam werden.
Das obige ist der detaillierte Inhalt vonWarum ist eine MySQL-„IN“-Abfrage mit einer Unterabfrage deutlich langsamer als mit expliziten Werten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!