Detaillierte Erläuterung der Leistungsoptimierung für MySQL-Batch-SQL-Einfügungen

Detaillierte Erläuterung der Leistungsoptimierung für MySQL-Batch-SQL-Einfügungen

Bei einigen Systemen mit großen Datenmengen bestehen die Probleme der Datenbank in einer geringen Abfrageeffizienz und einer langen Datenspeicherzeit. Insbesondere bei einem Berichtssystem kann der Zeitaufwand für den Datenimport mehrere Stunden oder sogar mehr als zehn Stunden pro Tag betragen. Daher ist es sinnvoll, die Einfügeleistung der Datenbank zu optimieren.

Nach einigen Leistungstests mit MySQL InnoDB habe ich einige Methoden gefunden, die die Einfügeeffizienz verbessern können. Diese dienen Ihnen als Referenz.

1. Eine SQL-Anweisung fügt mehrere Datensätze ein.

Zu den häufig verwendeten Insert-Anweisungen gehören:

INSERT INTO `insert_table` (`Datum/Uhrzeit`, `UID`, `Inhalt`, `Typ`) 
  WERTE ('0', 'Benutzer-ID_0', 'Inhalt_0', 0); 
INSERT INTO `insert_table` (`Datum/Uhrzeit`, `UID`, `Inhalt`, `Typ`) 
  WERTE ('1', 'Benutzer-ID_1', 'Inhalt_1', 1); 

Geändert zu:

INSERT INTO `insert_table` (`Datum/Uhrzeit`, `UID`, `Inhalt`, `Typ`) 
  WERTE ('0', 'Benutzer-ID_0', 'Inhalt_0', 0), ('1', 'Benutzer-ID_1', 'Inhalt_1', 1); 

Der geänderte Einfügevorgang kann die Einfügeeffizienz des Programms verbessern. Der Hauptgrund für die hohe Ausführungseffizienz des zweiten SQL besteht hier darin, dass die Menge der Protokolle nach dem Zusammenführen (MySQL-Binlog- und InnoDB-Transaktionen erstellen Protokolle) reduziert wird, wodurch die Menge und Häufigkeit der Protokolllöschung verringert und somit die Effizienz verbessert wird. Durch das Zusammenführen von SQL-Anweisungen kann die Anzahl der SQL-Anweisungsanalysen reduziert und die E/A der Netzwerkübertragung verringert werden.

Nachfolgend sind einige Testvergleichsdaten aufgeführt. Dabei handelt es sich um den Import einzelner Daten und die Konvertierung in eine SQL-Anweisung für den Import. Dabei werden jeweils 100, 1.000 und 10.000 Datensätze getestet.

2. Führen Sie den Einfügevorgang in einer Transaktion durch.

Ändern Sie den Einsatz in:

TRANSAKTION STARTEN; 
INSERT INTO `insert_table` (`Datum/Uhrzeit`, `UID`, `Inhalt`, `Typ`) 
  WERTE ('0', 'Benutzer-ID_0', 'Inhalt_0', 0); 
INSERT INTO `insert_table` (`Datum/Uhrzeit`, `UID`, `Inhalt`, `Typ`) 
  WERTE ('1', 'Benutzer-ID_1', 'Inhalt_1', 1); 
... 
BEGEHEN; 

Die Verwendung von Transaktionen kann die Effizienz der Dateneinfügung verbessern. Dies liegt daran, dass MySQL beim Ausführen einer INSERT-Operation intern eine Transaktion einrichtet und die eigentliche Einfügeverarbeitungsoperation innerhalb der Transaktion ausgeführt wird. Durch die Verwendung von Transaktionen können die Kosten zum Erstellen von Transaktionen reduziert werden und alle Einfügungen werden nach der Ausführung festgeschrieben.

Hier wird auch ein Testvergleich bereitgestellt, der den Fall der Nichtverwendung von Transaktionen und der Verwendung von Transaktionen bei einer Datensatzanzahl von 100, 1.000 und 10.000 abdeckt.

3. Die Daten werden der Reihe nach eingefügt.

Geordnete Dateneinfügung bedeutet, dass die eingefügten Datensätze basierend auf dem Primärschlüssel in der richtigen Reihenfolge angeordnet werden. Beispielsweise ist datetime der Primärschlüssel des Datensatzes:

INSERT INTO `insert_table` (`Datum/Uhrzeit`, `UID`, `Inhalt`, `Typ`) 
  WERTE ('1', 'Benutzer-ID_1', 'Inhalt_1', 1); 
INSERT INTO `insert_table` (`Datum/Uhrzeit`, `UID`, `Inhalt`, `Typ`) 
  WERTE ('0', 'Benutzer-ID_0', 'Inhalt_0', 0); 
INSERT INTO `insert_table` (`Datum/Uhrzeit`, `UID`, `Inhalt`, `Typ`) 
  WERTE ('2', 'Benutzer-ID_2', 'Inhalt_2', 2); 

Geändert zu:

INSERT INTO `insert_table` (`Datum/Uhrzeit`, `UID`, `Inhalt`, `Typ`) 
  WERTE ('0', 'Benutzer-ID_0', 'Inhalt_0', 0); 
INSERT INTO `insert_table` (`Datum/Uhrzeit`, `UID`, `Inhalt`, `Typ`) 
  WERTE ('1', 'Benutzer-ID_1', 'Inhalt_1', 1); 
INSERT INTO `insert_table` (`Datum/Uhrzeit`, `UID`, `Inhalt`, `Typ`) 
  WERTE ('2', 'Benutzer-ID_2', 'Inhalt_2', 2); 

Da die Datenbank beim Einfügen von Daten Indexdaten pflegen muss, erhöhen Datensätze in der falschen Reihenfolge den Aufwand für die Indexpflege. Wir können uns auf den von innodb verwendeten B+Tree-Index beziehen. Wenn jeder Datensatz am Ende des Index eingefügt wird, ist die Indexpositionierungseffizienz sehr hoch und die Indexanpassung gering. Wenn sich der eingefügte Datensatz in der Mitte des Index befindet, muss der B+Tree aufgeteilt und zusammengeführt werden, was mehr Rechenressourcen verbraucht und die Indexpositionierungseffizienz des eingefügten Datensatzes verringert. Bei einem großen Datenvolumen werden häufige Festplattenvorgänge durchgeführt.

Nachfolgend finden Sie einen Leistungsvergleich von Zufalls- und sequentiellen Daten mit Datensätzen von 100, 1.000, 10.000, 100.000 und 1 Million.

Aus den Testergebnissen geht hervor, dass die Leistung der Optimierungsmethode verbessert wurde, die Verbesserung ist jedoch nicht sehr offensichtlich.

Umfassender Leistungstest:

Hier ist ein Test zur Verwendung der oben genannten drei Methoden zur Optimierung der INSERT-Effizienz.

Aus den Testergebnissen können wir ersehen, dass die Leistungsverbesserung der Methode zum Zusammenführen von Daten + Transaktionen bei kleinen Datenmengen offensichtlich ist. Bei großen Datenmengen (mehr als 10 Millionen) sinkt die Leistung stark. Dies liegt daran, dass die Datenmenge zu diesem Zeitpunkt die Kapazität von innodb_buffer überschreitet. Jede Indexpositionierung erfordert mehr Lese- und Schreibvorgänge auf der Festplatte, und die Leistung sinkt schnell. Die Methode zum Zusammenführen von Daten + Transaktionen + geordneten Daten funktioniert auch dann noch gut, wenn das Datenvolumen mehrere zehn Millionen oder mehr erreicht. Bei großen Datenmengen ist die geordnete Datenindexpositionierung bequemer und erfordert keine häufigen Lese- und Schreibvorgänge auf der Festplatte, sodass eine höhere Leistung aufrechterhalten werden kann.

Notiz:

1. SQL-Anweisungen haben eine Längenbeschränkung. Beim Zusammenführen von Daten im selben SQL darf die Länge der SQL-Anweisung die SQL-Längenbeschränkung nicht überschreiten. Dies kann über die max_allowed_packet-Konfiguration geändert werden. Der Standardwert ist 1M, der während des Tests auf 8M geändert wurde.

2. Die Transaktionsgröße muss kontrolliert werden. Wenn die Transaktion zu groß ist, kann dies die Ausführungseffizienz beeinträchtigen. MySQL verfügt über ein Konfigurationselement innodb_log_buffer_size. Wenn dieser Wert überschritten wird, werden die InnoDB-Daten auf die Festplatte geschrieben und die Effizienz nimmt ab. Deshalb ist es besser, die Transaktion festzuschreiben, bevor die Daten diesen Wert erreichen.

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

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
  • Detaillierter Beispielcode einer MySQL-Batch-Einfügeschleife
  • MySQL-Batch-Einfügen von Datenskript
  • MySql-Batch-Insert-Optimierung. Beispiel für SQL-Ausführungseffizienz. Detaillierte Erklärung
  • MySQL fügt Daten im Batch über gespeicherte Funktionsprozeduren ein

<<:  Beispiel für den schnellen Aufbau einer LEMP-Umgebung mit Docker

>>:  Erläuterung unveränderlicher Werte in React

Artikel empfehlen

Prinzipielle Beispiele für die vier Netzwerktypen von Docker

Vier Netzwerktypen: Keine: Konfigurieren Sie kein...

JavaScript-Implementierung des Verifizierungscode-Falls

In diesem Artikel wird der spezifische Code für J...

Bedeutung und Verwendung einer Linux-CD

Was bedeutet Linux-CD? Unter Linux bedeutet cd „V...

Detaillierte Erklärung zur Verbindung von Java mit Mysql Version 8.0.18

In Bezug auf die Verbindungsmethode zwischen Java...

Detaillierte Erklärung der neuen CSS-Eigenschaft display:box

1. Anzeige:Box; Wenn Sie diese Eigenschaft für ei...

Designtheorie: Zehn Tipps zur Inhaltspräsentation

<br /> Der Entwurf einer persönlichen Schrei...

Probleme bei der Installation von Python3 und Pip in Ubuntu in Docker

Text 1) Laden Sie das Ubuntu-Image herunter Docke...

Setzen Sie den Eingang auf schreibgeschützt über deaktiviert und schreibgeschützt

Es gibt zwei Möglichkeiten, schreibgeschützte Eing...

Grafisches Tutorial zur Installation und Konfiguration von Mysql WorkBench

In diesem Artikel erfahren Sie mehr über die Inst...

Beispielcode zur Implementierung der PC-Auflösungsanpassung in Vue

Inhaltsverzeichnis planen Abhängigkeiten installi...

Natives JS zur Implementierung der Paging-Klicksteuerung

Dies ist eine Interviewfrage, die die Verwendung ...