Detaillierte Analyse des langsamen Abfrageproblems beim Senden von MySQL-Daten

Detaillierte Analyse des langsamen Abfrageproblems beim Senden von MySQL-Daten

Anhand eines Beispiels habe ich Ihnen die Lösung für das Problem der langsamen Abfrage von MySQL-Sendedatentabellen gezeigt.

Kürzlich habe ich bei der Codeoptimierung festgestellt, dass eine SQL-Anweisung sehr langsam war. Daher habe ich dies mit verschiedenen Methoden untersucht und schließlich die Ursache gefunden.

1. Unfallstelle

SELECT og.goods_barcode, og.color_id, og.size_id, SUM(og.goods_number) AS sold_number FROM Bestellung o 
LINKS JOIN order_goods og ON o.order_id = og.order_id WHERE o.is_send = 0 UND o.shipping_status = 0 
UND o.create_time > '2017-10-10 00:00:00' UND o.ck_id = 1 UND og.goods_id = 13421 UND o.is_separate = 1 UND o.order_status IN (0, 1) UND og.is_separate = 1 
GRUPPE NACH og.color_id, og.size_id

Bei der obigen Anweisung handelt es sich um eine Abfrageanweisung zur gemeinsamen Tabellengruppierung.

Ausführungsergebnis:

Wir können sehen, dass diese Anweisung 1.300 Sekunden und Sending data 1.28 Sekunden gedauert hat, was fast 99 % der Zeit in Anspruch nahm. Deshalb optimieren wir dies.

Wie kann es optimiert werden?

2. Drei Tricks zur SQL-Anweisungsanalyse

1. Analyse erklären

explain die obige Aussage:

erklären SELECT og.goods_barcode, og.color_id, og.size_id, SUM(og.goods_number) AS sold_number FROM order o 
LINKS JOIN order_goods og ON o.order_id = og.order_id WHERE o.is_send = 0 UND o.shipping_status = 0 
UND o.create_time > '2017-10-10 00:00:00' UND o.ck_id = 1 UND og.goods_id = 13421 UND o.is_separate = 1 UND o.order_status IN (0, 1) UND og.is_separate = 1 
GRUPPE NACH og.color_id, og.size_id

Ausführungsergebnis:

Durch explain können wir sehen, dass die obige Anweisung den key verwendet.

2. Prozessliste anzeigen

„Erklären“ offenbart das Problem nicht. Was ist also der Grund für die Langsamkeit?

Daher dachte ich daran, show processlist zu verwenden, um den Ausführungsstatus der SQL-Anweisung anzuzeigen. Die Abfrageergebnisse lauten wie folgt:

Dabei wurde festgestellt, dass sich die Abfrage längere Zeit im Status „Daten werden gesendet“ befand.

Informieren Sie sich über die Bedeutung des Status „Daten werden gesendet“. Es stellt sich heraus, dass der Name dieses Status sehr irreführend ist. Der sogenannte „Daten werden gesendet“ bedeutet nicht einfach nur Daten zu senden, sondern beinhaltet „Daten sammeln + senden“.

Der Schlüssel hier ist, warum Daten gesammelt werden müssen. Der Grund ist, dass MySQL, nachdem es den „Index“ verwendet hat, um die Abfrage abzuschließen, eine Reihe von Zeilen-IDs erhält. Wenn einige Spalten nicht im Index enthalten sind, muss MySQL zur „Datenzeile“ zurückkehren, um die zurückzugebenden Daten zu lesen und an den Client zurückzugeben.

3. Profil anzeigen

Um die Zeitverteilung der Abfrage weiter zu überprüfen, wird show profile verwendet, um die detaillierte Zeitverteilung anzuzeigen

Öffnen Sie zuerst die Konfiguration: setze „profile=on“;

Verwenden Sie nach der Ausführung der Abfrage „Profile anzeigen“, um die Abfrage-ID anzuzeigen.

Verwenden Sie „Profil anzeigen“ für die Abfrage „Query_ID“, um detaillierte Informationen anzuzeigen.

3. Fehlerbehebung und Optimierung

1. Prüfen und vergleichen

Nach den obigen Schritten wurde festgestellt, dass die langsame Abfrage darauf zurückzuführen ist, dass viel Zeit auf den Status „Daten senden“ verwendet wird. In Kombination mit der Definition „Daten senden“ konzentriert sich das Ziel auf die Rückgabespalte der Abfrageanweisung.

Nachdem wir alles einzeln überprüft hatten, entschieden wir uns schließlich, es in eine Beschreibungsspalte zu setzen. Das Design dieser Spalte ist: description varchar(8000) DEFAULT NULL COMMENT 'Spielbeschreibung',

Daher haben wir einen vergleichenden Ansatz gewählt, um zu sehen, wie das „Ergebnis ohne zurückgegebene Beschreibung“ aussehen würde. Die Ergebnisse von „Profil anzeigen“ sind wie folgt:

【Lösung】

Sobald die Grundursache des Problems gefunden ist, wird die Lösung nicht schwierig sein. Es gibt mehrere Möglichkeiten:

1) Entfernen Sie die Beschreibungsabfrage bei der Suche. Dies ist jedoch durch die Geschäftsimplementierung begrenzt und erfordert möglicherweise größere Anpassungen an den Geschäftsanforderungen.

2) Optimieren Sie die Tabellenstruktur und teilen Sie die Beschreibung in eine andere Tabelle auf. Dies ist eine große Änderung und erfordert die Zusammenarbeit des bestehenden Unternehmens bei der Änderung. Wenn das Unternehmen weiterhin die Informationen dieser Beschreibung abfragen muss, wird die Leistung nach der Optimierung nicht wesentlich verbessert.

Das könnte Sie auch interessieren:
  • Detaillierte Erklärung, warum die langsame Abfrageprotokollzeit von MySQL 5.7 8 Stunden hinter der Systemzeit liegt
  • Ursachen und Lösungen für langsame MySQL-Abfragegeschwindigkeit und schlechte Leistung
  • Ursachen und Lösungen für langsame MySQL-Abfragen
  • Gründe und Lösungen für langsame MySQL-Abfragen, die beim Senden von Daten hängen bleiben
  • So aktivieren Sie die Protokollfunktion für langsame Abfragen in MySQL
  • Beispiele für Optimierungstechniken zur Verbesserung der Effizienz langsamer Abfragen in MySQL IN-Anweisungen
  • So aktivieren Sie das langsame Abfrageprotokoll in MySQL
  • MySQL-Methode und Beispiel für langsame Abfragen

<<:  So verwenden Sie tcpdump zum Erfassen von Paketen im Linux-System

>>:  Vue implementiert grafischen Überprüfungscode

Artikel empfehlen

Eine kurze Einführung in den allgemeinen Prozess der Web-Frontend-Webentwicklung

Ich sehe viele Anfänger in der Front-End-Entwicklu...

Detaillierte Erklärung der Getter-Verwendung in vuex

Vorwort Mit Vuex können wir im Store „Getter“ def...

Befehlsliste des Baota Linux-Panels

Inhaltsverzeichnis Pagoda installieren Management...

HTML-Tutorial: Sammlung häufig verwendeter HTML-Tags (6)

Diese eingeführten HTML-Tags entsprechen nicht un...

Detaillierte Schritte zur Installation von Nginx unter Linux

1. Nginx-Installationsschritte 1.1 Offizielle Web...

Detaillierte Erläuterung der Angular-Datenbindung und ihrer Implementierung

Inhaltsverzeichnis Vorwort Was ist Datenbindung? ...

Vue implementiert die Drag & Drop-Sortierfunktion der Seiten-Div-Box

vue implementiert die Drag & Drop-Sortierfunk...

Spezifische Verwendung von MySQL-Operatoren (und, oder, in, nicht)

Inhaltsverzeichnis 1. Einleitung 2. Haupttext 2.1...

Erfahren Sie mehr über die Verwendung regulärer Ausdrücke in JavaScript

Inhaltsverzeichnis 1. Was ist ein regulärer Ausdr...

Hinweise zur IE8-Kompatibilität, die mir aufgefallen sind

1. getElementById von IE8 unterstützt nur IDs, nic...