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

Implementierungsbeispiel für die Nginx-Zugriffskontrolle

Über Nginx, eine leistungsstarke, leichte Webserv...

Eine kurze Erläuterung, wann MySQL interne temporäre Tabellen verwendet

Gewerkschaftsexekution Verwenden Sie zur Vereinfa...

Detaillierte Erklärung der MySQL-Binlog-Verwendung

binlog ist eine binäre Protokolldatei, die alle D...

Beispiel für einen WeChat-Applet-Rechner

In diesem Artikel wird der spezifische Code des W...

CSS zum Erzielen eines dynamischen Schaltflächeneffekts mit Partikeln

Ursprünglicher Link https://github.com/XboxYan/no...

Dieser Artikel zeigt Ihnen, wie Sie mit CSS-Kombinationsselektoren spielen

CSS-Kombinationsselektoren umfassen verschiedene ...

So installieren Sie Jupyter in Docker auf CentOS und öffnen Ports

Inhaltsverzeichnis Installieren Sie Jupyter Docke...

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

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

HTML-Code für Multiheader-Tabellen

1. Code der Multiheader-Tabelle Code kopieren Der ...

So führen Sie den Top-Befehl im Batchmodus aus

Der Befehl „top“ ist der beste Befehl, den jeder ...

Detaillierte Erklärung der Angular-Komponentenprojektion

Inhaltsverzeichnis Überblick 1. Einfaches Beispie...

Verwendung des MySQL-Zeitstempels

Vorwort: Zeitstempelfelder werden häufig in MySQL...