Schritte zum Importieren von Millionen von Daten in MySQL mit .Net Core

Schritte zum Importieren von Millionen von Daten in MySQL mit .Net Core

Vorbereitende Vorbereitung

Testformular 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

Betriebssystem: Windows 10 Professional

CPU: Intel(R) Core(TM) i7-8650U CPU @1,90 GHz 2,11 GHz

Speicher: 16G

MySQL-Version: 5.7.26

Implementierungsmethode:

1. Einfügen eines einzelnen Datensatzes

Dies 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ühren

MySQL 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ügen

MySQLBulkLoader 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:

secure_file_priv=

Leistungstestvergleich

Fü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:

endlich

Den 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:
  • .Net Core importiert zig Millionen Daten in MySQL-Datenbank
  • Detaillierte Erläuterung der MySQL-Datenbank mit zig Millionen Datenabfragen und -speicherungen
  • Optimierung der Abfragegeschwindigkeit von MySQL mit mehreren zehn Millionen Daten mithilfe von Indizes
  • MySQL-Schleife fügt zig Millionen Daten ein
  • So paginieren Sie schnell MySQL-Datenmengen im zweistelligen Millionenbereich
  • Optimierung der Leistung von Paging-Abfragen für MySQL mit mehreren zehn Millionen Daten
  • Wie lassen sich MySQL-Tabellen mit mehreren zehn Millionen Daten optimieren?
  • Austausch von Ideen zur Verarbeitung von Millionen von Daten in einer einzigen MySQL-Tabelle

<<:  Webseite WB.ExecWB - Beschreibung des Aufrufs der Druckmethode und Einführung in die Parameter

>>:  Was bedeuten CN2, GIA, CIA, BGP und IPLC?

Artikel empfehlen

So verwenden Sie Echarts zum Visualisieren von Komponenten in Vue

Offizielle Website-Adresse der Echarts-Komponente...

So legen Sie die Position des Blockelements in der Mitte des Fensters fest

So legen Sie die Position des Blockelements in de...

JavaScript implementiert eine Eingabefeldkomponente

In diesem Artikelbeispiel wird der spezifische Co...

Schritte zum Einrichten des Windows Server 2016 AD-Servers (Bild und Text)

Einführung: AD ist die Abkürzung für Active Direc...

Natives JS zur Implementierung der Drag-Position-Vorschau

In diesem Artikel wird eine kleine Demo gezeigt, ...

So installieren Sie MySQL 8.0 in Docker

Umgebung: MacOS_Cetalina_10.15.1, Mysql8.0.18, Do...

Lösung für den Fehler „MySQL-Server ist verschwunden“

MySQL-Server hat Problem in PHP behoben 1. Hinter...

Mit Mailto ist das Senden von E-Mails im HTML-Format ganz einfach

Kürzlich habe ich dem Footer-Postfach des Kunden e...