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

Detaillierte Schritte zur Installation der MySQL 5.6 X64-Version unter Linux

Umfeld: 1. CentOS6.5 X64 2.mysql-5.6.34-linux-gli...

Export- und Importvorgänge für Docker-Images

Was ist, wenn die Basis-Images bereits konfigurie...

Implementierung der Nginx-Flusskontrolle und Zugriffskontrolle

Nginx-Verkehrskontrolle Die Ratenbegrenzung ist e...

MySQL NULL-Datenkonvertierungsmethode (unbedingt lesen)

Wenn Sie MySQL zum Abfragen der Datenbank verwend...

Ein kurzes Verständnis der Unterschiede zwischen MySQL InnoDB und MyISAM

Vorwort MySQL unterstützt viele Arten von Tabelle...

Hadoop 2.x vs. 3.x 22-Punkte-Vergleich, Hadoop 3.x Verbesserungen gegenüber 2.x

Fragen-Leitfaden 1. Wie toleriert Hadoop 3.x Fehl...

Fünf praktische Tipps zur Gestaltung von Webformularen

1. Mobile Auswahl der Formulartexteingabe: Wenn i...

Tutorial zur Installation von MySQL8 auf Centos7

Neue Funktionen in MySQL 8: Meine persönliche Mei...

So verwenden Sie tcpdump zum Erfassen von Paketen im Linux-System

Lassen Sie mich zunächst einen Blick auf den Beis...

Detaillierte Erklärung der Bind-Mounts für die Docker-Datenspeicherung

Bevor Sie diesen Artikel lesen, hoffe ich, dass S...

MySQL-Reihe: Grundlegende Konzepte der relationalen MySQL-Datenbank

Inhaltsverzeichnis 1. Grundlegende Konzepte 2. En...

Einige Parameterbeschreibungen von Texteingabefeldern im Webdesign

In Gästebüchern, Foren und anderen Orten werden i...