Vorbereitende VorbereitungTestformular bestellen CREATE TABLE `Handel` ( `id` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', `trade_no` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', EINZIGARTIGER INDEX `id` (`id`), INDEX `Handelsnr.` (`Handelsnr.`) ) COMMENT = 'Bestellung' COLLATE='utf8_unicode_ci' ENGINE=InnoDB; Testumgebung
Implementierungsmethode:1. Einfügen eines einzelnen DatensatzesDies ist die gängigste Methode, bei der die Daten einzeln über eine Schleife importiert werden. Der offensichtliche Nachteil dieser Methode besteht darin, dass jedes Mal eine Verbindung zur Datenbank hergestellt werden muss. Implementierungscode: //Startzeit var startTime = DateTime.Now; mit (var conn = neue MySqlConnection(connsql)) { conn.Öffnen(); //100.000 Daten einfügen für (var i = 0; i < 100000; i++) { //Einfügen var sql = string.Format("insert into trade(id,trade_no) values('{0}','{1}');", Guid.NewGuid().ToString(), "handel_" + (i + 1) ); var sqlComm = neuer MySqlCommand(); sqlComm.Connection = Verbindung; sqlComm.CommandText = sql; sqlComm.ExecuteNonQuery(); sqlComm.Dispose(); } conn.Schließen(); } //Fertigstellungszeit var endTime = DateTime.Now; //Zeitaufwendig var spanTime = endTime - startTime; Console.WriteLine("Methode zum Einfügen einer Schleife dauert: " + spanTime.Minutes + "Minuten" + spanTime.Seconds + "Sekunden" + spanTime.Milliseconds + "Millisekunden"); 100.000 Tests dauern: Im obigen Beispiel importieren wir 100.000 Datensätze in Stapeln und müssen 100.000 Mal eine Verbindung zur Datenbank herstellen. Wir ändern die SQL-Anweisungen auf 1000 und verketten diese zu 1, wodurch die Datenbankverbindung reduziert werden kann. Der Code wird wie folgt geändert: //Startzeit var startTime = DateTime.Now; mit (var conn = neue MySqlConnection(connsql)) { conn.Öffnen(); //100.000 Daten einfügen var sql = new StringBuilder(); für (var i = 0; i < 100000; i++) { //Fügen Sie sql.AppendFormat ein("insert into trade(id,trade_no) values('{0}','{1}');", Guid.NewGuid().ToString(), "handel_" + (i + 1) ); //Zusammenführen und einfügen, wenn (i % 1000 == 999) { var sqlComm = neuer MySqlCommand(); sqlComm.Connection = Verbindung; sqlComm.CommandText = sql.ToString(); sqlComm.ExecuteNonQuery(); sqlComm.Dispose(); sql.Löschen(); } } conn.Schließen(); } //Fertigstellungszeit var endTime = DateTime.Now; //Zeitaufwendig var spanTime = endTime - startTime; Console.WriteLine("Methode zum Einfügen einer Schleife dauert: " + spanTime.Minutes + "Minuten" + spanTime.Seconds + "Sekunden" + spanTime.Milliseconds + "Millisekunden"); 100.000 Tests dauern: Nach der Optimierung sind für die Datenbankverbindung nur 100.000 Verbindungen erforderlich, die ursprünglich 100.000 Mal erforderlich waren. Gemessen an den endgültigen Betriebsergebnissen ist die Leistungsverbesserung nicht offensichtlich, da sich die Datenbank auf demselben Server befindet und keine Netzwerkübertragung erfolgt. 2. Dateneinfügung zusammenführenMySQL unterstützt auch den Batch-Datenimport durch Zusammenführen von Daten. Implementierungscode: //Startzeit var startTime = DateTime.Now; mit (var conn = neue MySqlConnection(connsql)) { conn.Öffnen(); //100.000 Daten einfügen var sql = new StringBuilder(); für (var i = 0; i < 100000; i++) { wenn (i % 1000 == 0) { sql.Append("in trade(id,trade_no)-Werte einfügen"); } // Verkettung sql.AppendFormat("('{0}','{1}'),", Guid.NewGuid().ToString(), "trade_" + (i + 1)); //Füge 1000 Datensätze auf einmal ein, wenn (i % 1000 == 999) { var sqlComm = neuer MySqlCommand(); sqlComm.Connection = Verbindung; sqlComm.CommandText = sql.ToString().TrimEnd(','); sqlComm.ExecuteNonQuery(); sqlComm.Dispose(); sql.Löschen(); } } conn.Schließen(); } //Fertigstellungszeit var endTime = DateTime.Now; //Zeitaufwendig var spanTime = endTime - startTime; Console.WriteLine("Die Methode zum Einfügen von Zusammenführungsdaten benötigt Zeit: " + spanTime.Minutes + "Minuten" + spanTime.Seconds + "Sekunden" + spanTime.Milliseconds + "Millisekunden"); 100.000 Tests dauern: Das Einfügen von Vorgängen auf diese Weise kann die Einfügeeffizienz des Programms erheblich verbessern. Obwohl die erste Methode auch die Anzahl der Datenbankverbindungen nach der Optimierung reduzieren kann, verringert die zweite Methode die Menge der Protokolle nach dem Zusammenführen (MySQL-Binlog- und InnoDB-Transaktionsprotokolle), verringert die Menge und Häufigkeit des Protokollleerens und verbessert somit die Effizienz. Gleichzeitig kann dadurch auch die Anzahl der zum Parsen von SQL-Anweisungen erforderlichen Zeiten und die E/A-Übertragung im Netzwerk reduziert werden. 3. MySqlBulkLoader einfügenMySQLBulkLoader wird auch LOAD DATA INFILE genannt. Sein Prinzip besteht darin, Daten aus einer Datei zu lesen. Daher müssen wir unseren Datensatz in einer Datei speichern und ihn dann aus der Datei lesen. Implementierungscode: //Startzeit var startTime = DateTime.Now; mit (var conn = neue MySqlConnection(connsql)) { conn.Öffnen(); var Tabelle = neue Datentabelle(); Tabelle.Spalten.Hinzufügen("id", Typ von(Zeichenfolge)); Tabelle.Spalten.Hinzufügen("trade_no", typeof(string)); //100.000 Daten generieren für (var i = 0; i < 100000; i++) { wenn (i % 500000 == 0) { Tabelle.Zeilen.Löschen(); } //Datensatz var row = table.NewRow(); Zeile[0] = Guid.NewGuid().ToString(); Zeile[1] = "Handel_" + (i + 1); Tabelle.Zeilen.Add(Zeile); //500.000 Datensätze in einem Stapel einfügen, wenn (i % 500000 != 499999 && i < (100000 - 1)) { weitermachen; } Console.WriteLine("Einfügen beginnen: " + i); //Daten ins CSV-Format konvertieren var tradeCsv = DataTableToCsv(table); var tradeFilePath = System.AppDomain.CurrentDomain.BaseDirectory + "trade.csv"; File.WriteAllText(Handelsdateipfad, Handels-Csv); #region In Datenbank speichern var bulkCopy = new MySqlBulkLoader(conn) { FeldTerminator = ",", Feldzitatzeichen = '"', EscapeCharacter = '"', Zeilenabschluss = "\r\n", Dateiname = Handelsdateipfad, AnzahlZuÜberspringenderZeilen = 0, Tabellenname = "Handel" }; bulkCopy.Columns.AddRange(table.Columns.Cast<DataColumn>().Select(colum => colum.ColumnName).ToList()); bulkCopy.Laden(); #endregion } conn.Schließen(); } //Fertigstellungszeit var endTime = DateTime.Now; //Zeitaufwendig var spanTime = endTime - startTime; Console.WriteLine("MySqlBulk-Methode benötigt: " + spanTime.Minutes + "Minuten" + spanTime.Seconds + "Sekunden" + spanTime.Milliseconds + "Millisekunden"); 100.000 Tests dauern: Hinweis: Die MySQL-Datenbankkonfiguration muss aktiviert sein: Dateiimport zulassen. Die Konfiguration ist wie folgt:
LeistungstestvergleichFür die drei oben genannten Methoden wurden 100.000, 200.000, 1 Million und 10 Millionen Datensätze getestet. Die endgültige Leistung ist wie folgt: endlichDen Testdaten zufolge ist die Leistung der Methode MySqlBulkLoader bei zunehmender Datenmenge immer noch gut, während die Leistung anderer Methoden deutlich abnimmt. Die MySqlBulkLoader-Methode kann unsere Anforderungen vollständig erfüllen. Oben finden Sie die detaillierten Schritte zum Importieren von zig Millionen Daten in MySQL mit .Net Core. Weitere Informationen zum Importieren von zig Millionen Daten in MySQL finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
<<: Webseite WB.ExecWB - Beschreibung des Aufrufs der Druckmethode und Einführung in die Parameter
>>: Was bedeuten CN2, GIA, CIA, BGP und IPLC?
Offizielle Website-Adresse der Echarts-Komponente...
So legen Sie die Position des Blockelements in de...
In diesem Artikelbeispiel wird der spezifische Co...
Beim Produktdesign legen Designer Wert darauf, das...
Einführung: AD ist die Abkürzung für Active Direc...
In diesem Artikel wird eine kleine Demo gezeigt, ...
Inhaltsverzeichnis Vorwort Untergeordnete Kompone...
Prämisse In komplexen Szenarien müssen große Date...
Erkennen Sie die Unterschiede zwischen den Method...
Umgebung: MacOS_Cetalina_10.15.1, Mysql8.0.18, Do...
MySQL-Server hat Problem in PHP behoben 1. Hinter...
Kostenlose Punkte Interviewer : Haben Sie schon e...
1. CLion herunterladen, installieren und aktivier...
Kürzlich habe ich dem Footer-Postfach des Kunden e...
Detailliertes Beispiel zum Abrufen des Maximalwer...