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;
(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 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!