Detaillierter Beispielcode einer MySQL-Batch-Einfügeschleife

Detaillierter Beispielcode einer MySQL-Batch-Einfügeschleife

Hintergrund

Als ich vor einigen Tagen Paging in MySql durchführte, sah ich einen Blog-Beitrag, in dem stand, dass die Verwendung des Limits 0,10 für Paging zu Datenverlust führen würde, während jemand anderes sagte, dass dies nicht passieren würde. Deshalb wollte ich es selbst testen. Während des Tests gab es keine Daten, also habe ich MySql installiert und eine Tabelle erstellt. Als ich eine While-Schleife erstellte, um 100.000 Testdaten stapelweise einzufügen, war die Ausführungszeit unerträglich, also suchte ich nach Informationen, um eine Möglichkeit zur Optimierung der Stapeleinfügung zu finden. Ich habe mir hier eine Notiz gemacht.

Datenstruktur

Da Standardspalten beim Paging in drei Szenarien unterteilt werden: Primärschlüsselspalte, Indexspalte und gemeinsame Spalte, muss die Testtabelle diese drei Szenarien enthalten. Die Syntax zur Tabellenerstellung lautet wie folgt:

Tabelle löschen, falls `test`.`t_model` existiert;

Erstellen Sie die Tabelle `test`.`t_model`( 
 `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'Primärschlüssel automatisch inkrementieren',
 `uid` bigint KOMMENTAR 'Primärschlüssel des Unternehmens',
 `modelid` varchar(50) COMMENT 'Charakter-Primärschlüssel',
 `Modellname` varchar(50) KOMMENTAR 'Name',
 `desc` varchar(50) COMMENT 'Beschreibung',
 Primärschlüssel („id“)
 EINZIGARTIGER Index `uid_unique` (`uid`),
 Schlüssel `modelid_index` (`modelid`) USING BTREE
)ENGINE=InnoDB Zeichensatz=utf8 sortieren=utf8_bin;

Zur Vereinfachung der Bedienung verwendet der Einfügevorgang eine gespeicherte Prozedur, um geordnete Daten über eine While-Schleife einzufügen, und die Leistung anderer Operationsmethoden oder Schleifenmethoden wird nicht überprüft.

Ausführungsprozess

1. Verwenden Sie die einfachste Methode, um 1W-Elemente direkt zu schleifen und einzufügen. Die Syntax lautet wie folgt:

Prozedur löschen, falls my_procedure vorhanden ist; 
Trennzeichen //
Prozedur my_procedure() erstellen
beginnen
 DECLARE n int DEFAULT 1;
 WÄHREND n < 10001 TUN
 in t_model einfügen (uid, modelid, modelname, `desc`) Wert (n, CONCAT('id20170831', n), CONCAT('name', n), 'desc'); 
 setze n = n + 1;
 ENDE WÄHREND;
Ende
// 
              Trennzeichen ;

Die Ausführungszeit zum Einfügen von 10.000 Datenelementen beträgt etwa 6 Minuten und 7 Sekunden. Bei dieser Geschwindigkeit dauert das Einfügen von 10 Millionen Datenelementen mehrere Tage.

2. Erwägen wir also das Hinzufügen eines Transaktions-Commits. Kann dies die Leistung beschleunigen? Der Test führt alle 1000 Datensätze ein Commit durch. Die Syntax lautet wie folgt:

Trennzeichen //
Prozedur u_head_and_low_pro() erstellen
beginnen
 DECLARE n int DEFAULT 17541;
 WÄHREND n < 10001 TUN
   in t_model einfügen (uid, modelid, modelname, `desc`) Wert (n, CONCAT('id20170831', n), CONCAT('name', n), 'desc'); 
   setze n = n + 1;
   wenn n % 1000 = 0 
   Dann
    begehen;
   Ende wenn;
 ENDE WÄHREND;
Ende
//
Trennzeichen ;

Die Ausführungszeit beträgt 6 Minuten und 16 Sekunden, was sich nicht wesentlich von der Ausführung ohne Commit unterscheidet. Es scheint, dass die Leistung des Batch-Einfügens auf diese Weise sehr gering ist.

3. Verwenden Sie die gespeicherte Prozedur, um eine Batch-Insert-Anweisung zu generieren und diese auszuführen, um 10.000 Datensätze einzufügen. Die Syntax lautet wie folgt:

Löschprozedur, WENN u_head_and_low_pro EXISTIERT;
Trennzeichen $$
Prozedur u_head_and_low_pro() erstellen
beginnen
 DECLARE n int DEFAULT 1;
 setze @exesql = 'in t_model(uid,modelid,modelname,`desc`)-Werte einfügen';
 setze @exedata = '';
 WÄHREND n < 10001 TUN
 setze @exedata = concat(@exedata,"(",n,",","'id20170831",n,"','","name",n,"','","desc'",")");
 wenn n % 1000 = 0 
 Dann
  setze @exesql = concat(@exesql,@exedata,";");
  bereiten Sie den Anweisungssatz von @exesql vor;
  Anweisung ausführen;
  DEALLOCATE, Anweisung vorbereiten;
  begehen; 
  setze @exesql = 'in t_model(uid,modelid,modelname,`desc`)-Werte einfügen';
  setze @exedata = "";
 anders
  setze @exedata = concat(@exedata,',');
 Ende wenn;
 setze n = n + 1;
 ENDE WÄHREND;
Ende;$$ 
Trennzeichen ;

Ausführungszeit 3,308 s.

Zusammenfassen

Verwenden Sie beim Einfügen in Stapeln die Stapelmethode zum Einfügen von Werten, wodurch die Ausführungsgeschwindigkeit erheblich verbessert wird.

Oben sehen Sie den ausführlichen Beispielcode für MySQL-Batch-Inserts in einer Schleife, der vom Herausgeber eingeführt wurde. Ich hoffe, er ist für alle hilfreich. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Herausgeber wird Ihnen rechtzeitig antworten. Ich möchte auch allen für ihre Unterstützung der Website 123WORDPRESS.COM danken!
Wenn Sie diesen Artikel hilfreich finden, können Sie ihn gerne abdrucken und dabei bitte die Quelle angeben. Vielen Dank!

Das könnte Sie auch interessieren:
  • Beispiele für 4 Methoden zum Einfügen großer Datenmengen in MySQL
  • MySQL-Batch-Einfügungsdaten-Implementierungscode
  • Tutorial zur Implementierung von Batch-Einfügungen in MySQL zur Leistungsoptimierung
  • So vermeiden Sie MySQL-Batch-Einfügungen mit eindeutigen Indizes
  • Mysql verwendet Einfügen, um mehrere Datensätze einzufügen und Daten stapelweise hinzuzufügen
  • MySQL-Batch-Einfügen von Datenskript
  • Detaillierte Erläuterung der Leistungsoptimierung für MySQL-Batch-SQL-Einfügungen
  • MySql-Batch-Insert-Optimierung. Beispiel für SQL-Ausführungseffizienz. Detaillierte Erklärung
  • MySQL fügt Daten im Batch über gespeicherte Funktionsprozeduren ein

<<:  Hinweise zur Konfiguration mehrerer Proxys mithilfe von Vue-Projekten

>>:  Lösen Sie das Problem des schwarzen Bildschirms, nachdem VMware das Linux-System installiert und gestartet hat

Artikel empfehlen

Verwendung des Linux-Befehls „userdel“

1. Befehlseinführung Der Befehl userdel (User Del...

Was sind MySQL-Dirty-Pages?

Inhaltsverzeichnis Schmutzige Seiten (Speichersei...

Beispiel zum Ändern der inländischen Quelle in Ubuntu 18.04

Die eigene Quelle von Ubuntu stammt aus China, da...

Über die Überlappung von Randwert und vertikalem Rand in CSS

Rand paralleler Boxen (Überlappung doppelter Ränd...

Eine dauerhafte Lösung für MySQLs Unfähigkeit, Chinesisch zu erkennen

In den meisten Fällen unterstützt MySQL Chinesisc...

So verschieben Sie den Datenspeicherort von mysql5.7.19 in Centos7

Szenario: Mit zunehmender Datenmenge ist die Fest...

Eine kurze Diskussion über den magischen Schrägstrich im Nginx Reverse Proxy

Beim Konfigurieren des Nginx-Reverse-Proxys könne...

JavaScript zum Erreichen eines Mouse-Tailing-Effekts

Mauseffekte erfordern die Verwendung von setTimeo...

Tutorial zur manuellen Installation von MySQL 8.0.13

In diesem Artikel finden Sie das Tutorial zur man...

So führen Sie eine reibungslose if-Beurteilung in js durch

Inhaltsverzeichnis Vorwort Code-Implementierung I...

Verständnis und Anwendungsszenarien von ES6-Erweiterungsoperatoren

Inhaltsverzeichnis 1. Ersetzen Sie die Apply-Meth...

Lösung zur Installation von Vim im Docker-Container

Inhaltsverzeichnis Der Anfang der Geschichte Inst...