Heim > Datenbank > MySQL-Tutorial > Detaillierte Erläuterung der in MySQL in der Produktionsbibliothek gefundenen Unterabfragebeispiele

Detaillierte Erläuterung der in MySQL in der Produktionsbibliothek gefundenen Unterabfragebeispiele

黄舟
Freigeben: 2017-08-13 10:56:46
Original
1184 Leute haben es durchsucht

DBAs oder Entwickler, die Oracle oder andere relationale Datenbanken verwendet haben, sind alle der Meinung, dass die Datenbank für Unterabfragen optimiert wurde, und können diese Erfahrung dann auf MySQL auf die Datenbank übertragen. Aber leider kann MySQL Sie bei der Verarbeitung von Unterabfragen enttäuschen. Auf unserem Produktionssystem ist dieses Problem aufgetreten:

select  i_id, sum(i_sell) as i_sell
from table_data
where i_id in (select i_id from table_data where Gmt_create >= ‘2011-10-07 00:00:00’)
group by i_id;
Nach dem Login kopieren

(Hinweis: SQL-Geschäftslogik kann als Analogie verwendet werden: Fragen Sie zuerst die 100 Bücher ab neu verkauft am 10.07. und fragen Sie dann die Verkäufe dieser 100 neu verkauften Bücher im Laufe des Jahres ab).

Der Grund für das Leistungsproblem dieses SQL ist die Schwäche des MySQL-Optimierers bei der Verarbeitung von Unterabfragen. Wenn der MySQL-Optimierer die Unterabfrage verarbeitet, schreibt er die Unterabfrage neu. Normalerweise hoffen wir, die Ergebnisse der Unterabfrage zuerst von innen nach außen zu vervollständigen und dann die Unterabfrage zum Ansteuern der äußeren Abfragetabelle zu verwenden, um die Abfrage abzuschließen. Bei der MySQL-Verarbeitung werden jedoch zunächst alle Daten in der äußeren Tabelle gescannt. und jedes Die Daten werden an die Unterabfrage übertragen und mit der Unterabfrage verknüpft. Bei der obigen Abfrage treten Leistungsprobleme auf, da die Daten in der Tabelle table_data 70 W haben Daten, Gleichzeitig gibt es viele Daten in der Unterabfrage, und eine große Menge davon wird wiederholt, was fast 700.000 Korrelationen erfordert. Die große Anzahl von Korrelationen führt dazu, dass diese SQL mehrere Stunden lang ausgeführt wird, ohne abgeschlossen zu werden. also müssen wir die SQL neu schreiben:

Wir haben die Unterabfrage in „Assoziation“ geändert und der Unterabfrage „distinct“ hinzugefügt, um die Häufigkeit zu reduzieren, mit der t1 mit t2 verknüpft wird.
SELECT t2.i_id, SUM(t2.i_sell) AS sold
FROM (SELECT distinct i_id FROM table_data
WHERE gmt_create >= ‘2011-10-07 00:00:00’) t1,  table_data t2
WHERE t1.i_id = t2.i_id GROUP BY t2.i_id;
Nach dem Login kopieren

Nach dem Durch die Transformation wurde die Ausführungszeit von SQL auf weniger als 100 ms reduziert.

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der in MySQL in der Produktionsbibliothek gefundenen Unterabfragebeispiele. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
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