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

Teilen Sie die Fallstricke von MySQLs current_timestamp und ihre Lösungen

Inhaltsverzeichnis MySQLs current_timestamp-Falle...

Beispiel für eine automatische Importmethode für allgemeine Vue3.0-Komponenten

1. Voraussetzungen Wir verwenden zum Importieren ...

So implementieren Sie verschiebbare Komponenten in Vue

In diesem Artikel erfahren Sie, wie Sie ziehbare ...

Detaillierte Erläuterung der MySQL 8.0-Wörterbuchtabellenerweiterung

Das Datenwörterbuch in MySQL ist eine der wichtig...

3 häufige Fehler beim Lesen von MySQL Binlog-Protokollen

1. mysqlbinlog: [FEHLER] unbekannte Variable „def...

Web 2.0: Ursachen und Lösungen der Informationsüberflutung

<br />Informationsduplikation, Informationsü...

So optimieren Sie die MySQL-Abfragegeschwindigkeit

In den vorherigen Kapiteln haben wir die Auswahl ...

So verweisen Sie direkt auf Vue und Element-UI in HTML

Der Code sieht folgendermaßen aus: <!DOCTYPE h...

Untersuchung des Wertes des Positionsattributs in CSS (Zusammenfassung)

Das CSS-Positionsattribut gibt den Positionierung...

Basiswissen: Was bedeutet http vor einer Website-Adresse?

Was ist HTTP? Wenn wir eine Website durchsuchen m...

Teilen Sie 8 sehr nützliche CSS-Entwicklungstools

CSS3-Mustergalerie Diese CSS3-Musterbibliothek ze...

Grafisches Tutorial zur MySQL8-Installationsversion

Installation Die erforderlichen Unterlagen finden...