In den letzten Tagen habe ich mir eine leistungsoptimierte gespeicherte Prozedur angesehen. Die Laufzeit dieser gespeicherten Prozedur in der Produktionsumgebung des Kunden (die Datenbank ist MySQL 5.1) beträgt mehr als 30 bis 40 Minuten Die Anforderung besteht darin, die
Implementierung dieser gespeicherten Prozedur zu verbessern:
1 Die Abfragen von zwei Tabellen (aus geschäftlichen Gründen umfassen auch Unterabfragen der Tabelle) werden jeweils in temporäre Tabellen eingefügt Die Daten der beiden Tabellen sind 310W+, 120W
2. In der Mitte muss eine gewisse Verarbeitung durchgeführt werden, und die Datengruppe der temporären Tabelle wird in eine andere temporäre Tabelle eingefügt 🎜>3. Schließlich wird die Datengruppe der temporären Tabelle eingefügt. Ich bin zu einer formalen Tabelle gelangt und habe 140W+-Daten eingefügt.
Dann bin ich in den letzten Tagen immer weiter auf dem Weg zur Leistungsoptimierung gegangen. Ich probiere alle möglichen Methoden aus und erlebe alle möglichen Schwierigkeiten.
Bilder aus der App
Verschiedene Versuche:
1. Ich finde, dass die Logik dieser Implementierung etwas komplex ist , und dann die Umsetzung nach meinen Vorstellungen vereinfacht. Die Leistung wird jedoch nicht verbessert. Weil meine Implementierung die große Datenmenge in den Vordergrund rückt und nachfolgende Vorgänge diese große Datenmenge verarbeiten müssen, z. B. Gruppieren nach. Obwohl meine Implementierung logisch vereinfacht ist, wird die Leistung nicht verbessert.
2. Basierend auf unterschiedlichen logischen Bezeichnern werden zwei Sätze temporärer Tabellen erstellt, sodass die Datenmenge in einer Tabelle nicht so groß wird, in der Hoffnung, den Druck auf nachfolgende Vorgänge zu verringern. Trotzdem scheiterte es. Der Grund dafür ist, dass aufgrund der Festlegung logischer Bezeichner alles auf einem Satz Logik basiert. Der zweite Satz Logik ist nur eine Formalität und überprüft die Tabelle nicht mit Millionen von Daten, sodass der Druck immer noch auf dem Tisch liegt mit mehr als 3 Millionen.
3. Verwenden Sie vorbereitete Aussagen. Tatsächlich weiß ich nicht viel über den Mechanismus der Vorverarbeitung von Anweisungen. Ich habe gerade gehört, dass die Vorverarbeitung effizienter ist. Die Leistung hat sich immer noch nicht verbessert, wahrscheinlich weil es nicht viele ähnliche Abfragen oder Einfügungen gibt. Hmm, ich verstehe den Vorverarbeitungsmechanismus nicht ganz.
4. Entfernen Sie die Unterabfrage und verwenden Sie eine temporäre Tabelle, um diesen Teil der Daten zu speichern. Auf diese Weise muss die Tabelle mit mehr als 3 Millionen Daten noch zweimal überprüft werden, und es gibt keine Leistungsverbesserung.
5. Ändern Sie die Engine der temporären Tabelle von myisam in den Speicher. Die globalen Variablen max_heap_table_size und tmp_table_size der Datenbank werden ebenfalls auf 1000 MB gesetzt, was der Produktionsumgebung entspricht. Das Ergebnis meldet immer noch
, also ist die Datenmenge zu groß und der Speicher platzt?
The table 'tmp_item_bu_parter_price' is full
Nach dem Login kopieren
Sechstens folgte ich auch verschiedenen Zweigen der Logik, stellte jedoch fest, dass sie alle derselben Logik folgten. Das ist ein kleiner Nachteil. Ich habe vorher lange darüber nachgedacht und mich nicht zuerst über die Einstellungen des Kunden informiert.
7. Multithreading. Da die Syntax von insert into ...select... in der gespeicherten Prozedur verwendet wird und die Where-Bedingung nicht indiziert ist, wird eine vollständige Tabellensperre verursacht. Das Ergebnis des Multithread-Tests ist zweifellos die Sperrtabelle, und die Ausführung einiger Daten schlägt fehl.
8. Logischerweise wird nicht vollständig eingefügt, sondern in Schritten, die vorhandenen Daten müssen jedoch noch aktualisiert werden. Die Leistung sollte also ungefähr gleich sein.
Leistung wird hauptsächlich durch das Einfügen von Millionen von Daten verbraucht. Jetzt bin ich völlig ratlos und weiß nicht, wie ich damit umgehen soll.
[Verwandte Empfehlungen]
1.
Kostenloses MySQL-Online-Video-Tutorial
2. Neuestes MySQL-Handbuch-Tutorial
3. Dinge zum Datenbankdesign
Das obige ist der detaillierte Inhalt vonTeilen Sie einige der Probleme mit, auf die ich während der dreitägigen Leistungsoptimierung gestoßen bin. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!