Heim > Datenbank > MySQL-Tutorial > Hauptteil

Warum ist eine MySQL-„IN'-Abfrage mit einer Unterabfrage deutlich langsamer als mit expliziten Werten?

Barbara Streisand
Freigeben: 2024-10-31 02:09:02
Original
627 Leute haben es durchsucht

 Why is a MySQL

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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
Nach dem Login kopieren

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!

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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!