Vergleich der Effizienz der Dateneinfügung in MySQL

Vergleich der Effizienz der Dateneinfügung in MySQL

Beim Einfügen von Daten stellte ich fest, dass ich bei meiner Arbeit an Office-Systemen nie über die Datenbankleistung nachgedacht hatte. Da es sich um eine kleine Datenmenge handelte, waren Zeitaufwand und Effizienz nicht offensichtlich. Aber wenn die Datenmenge sehr groß ist, so groß, dass 10.000 Einfügungen pro Sekunde erforderlich sind, müssen Sie Ihre SQL-Anweisungen berücksichtigen. Beim Einfügen von 100 Daten können folgende Dateneinfügungsmethoden in Betracht gezogen werden:

1: 100-malige For-Schleife, Daten immer wieder einfügen. Einmal verbinden und 100-mal einfügen, was am zeitaufwändigsten ist und die meisten IO- und Verbindungsvorgänge verbraucht.

2: Kombinieren Sie 100 Dateneinfügeanweisungen zu einer SQL-Anweisung, stellen Sie dann einmal eine Verbindung her und fügen Sie die Daten ein. Diese Methode ist zeitaufwändiger als die erste.

3: Verwenden Sie Transaktionen, fügen Sie 100 Mal ein und bestätigen Sie die letzte Transaktion. Diese Methode ist schneller als die zweite Methode.

4: Verwenden Sie die Insert-Anweisung selbst, um mehrere Daten einzufügen;

Wenn die oben genannten Methoden auf eine kleine Datenmenge angewendet werden, gibt es fast keinen Unterschied und wir können ihn überhaupt nicht spüren. Wenn die Datenmenge jedoch etwas größer ist, beispielsweise 10.000 Datenelemente auf einmal. Die Geschwindigkeit und Effizienz des Einführens kommen zum Vorschein;

Dies ist die MySQL-Instanzklasse; diese Instanz stellt MySQL-Verbindungen und datenbankbezogene Operationen bereit

öffentliche Klasse MySqlInstance
  {
    //Verbindungszeichenfolge private statische Zeichenfolge mySqlConnectionStr = "Server = localhost; Datenbank = Test; Uid = root; Pwd = Passwort.1;";
    private statische MySqlConnection _mysqlConnect;
    private statische MySqlConnection mysqlConnect
    {
      erhalten
      {
        wenn (null == _mysqlConnect)
        {
          _mysqlConnect = neue MySqlConnection(mySqlConnectionStr);
        }
        gibt _mysqlConnect zurück;
      }
    }
    privater statischer MySqlCommand _mysqlCommand;
    privater statischer MySqlCommand mysqlCommand
    {
      erhalten
      {
        wenn (null == _mysqlCommand)
        {
          _mysqlCommand = mysqlConnect.CreateCommand();
        }
        gibt _mysqlCommand zurück;
      }
    }
    //Öffne die Verbindung public static void OpenConnect()
    {
      mysqlConnect.Öffnen();
    }
    //Verbindung schließen public static void CloseConnect()
    {
      mysqlConnect.Close();
    }
    öffentliche statische MySqlConnection-Verbindung
    {
      erhalten
      {
        gibt mysqlConnect zurück;
      }
    }
    //Daten mit Anti-Injection-Methode einfügen //Verwenden Sie zum Einfügen die Transaktion 10000 und bestätigen Sie die Transaktion einmal am Ende public static int InsertData(string Command, List<MySqlParameter> Params)
    {
      //Programmzeitüberwachung Stoppuhr sw = new Stopwatch();
      //Programmzeitpunkt startssw.Start();
      Öffnen SieConnect();
      //Transaktion starten MySqlTransaction trans = mysqlConnect.BeginTransaction();
      mysqlCommand.CommandText = Befehl;
      mysqlCommand.Parameters.AddRange(Params.ToArray());
      int-Anzahl = 0;
      für (int i = 0; i < 10000; i++)
      {
        wenn (mysqlCommand.ExecuteNonQuery() > 0)
          zählen++;
      }
      //Transaktions-Commit trans.Commit();
      Schließen SieConnect();
      mysqlCommand.Parameters.Clear();
      //Der Timer stoppt sw.Stop();
      Zeitspanne ts2 = sw.Verstrichen;
      Console.WriteLine(ts2.TotalMilliseconds);
      Anzahl zurückgeben;
    }
    //Die Abfrageergebnisse liegen in MySqlDataReader. Sie können die Verbindung nicht schließen, wenn Sie sie verwenden möchten. public static MySqlDataReader SelectData(string sql)
    {
      Stoppuhr sw = neue Stoppuhr();
      sw.Start();
      // Öffnen SieConnect();
      MySqlCommand newcommond = neuer MySqlCommand(sql, mysqlConnect);
      MySqlDataReader-Daten = newcommond.ExecuteReader();
      // Schließen SieConnect();
      sw.Stopp();
      Zeitspanne ts2 = sw.Verstrichen;
      Console.WriteLine(ts2.TotalMilliseconds);
      Daten zurückgeben;
    }
    /// <Zusammenfassung>
    /// Die Abfrage ergibt einen Datensatz/// </summary>
    /// <param name="sql"></param>
    /// <Rückgabe></Rückgabe>
    öffentliches statisches DataSet SelectDataSet (Zeichenfolge SQL)
    {
      MySqlCommand newcommond = neuer MySqlCommand(sql, mysqlConnect);
      MySqlDataAdapter-Adapter = neuer MySqlDataAdapter();
      adapter.SelectCommand = neuer Befehl;
      Datensatz ds = neuer Datensatz();
      Adapter.Füllen(ds);
      Rückgabe ds;
    }
    //Unsicheres Einfügen mit Injektion public static int InsertDataSql(string sql)
    {
      // Öffnen SieConnect();
      mysqlCommand.Befehlstext = sql;
      : In diesem Fall muss mysql.exe ExecuteNonQuery();
      // Schließen SieConnect();
      Anzahl zurückgeben;
    }
    //Parameter sicher einfügen mit @
    //10.000 Mal einfügen, ohne Transaktionen zu verwenden public static int InsertDataNoTran(string Command, List<MySqlParameter> Params)
    {
      Stoppuhr sw = neue Stoppuhr();
      sw.Start();
      Öffnen SieConnect();
      mysqlCommand.CommandText = Befehl;
      mysqlCommand.Parameters.AddRange(Params.ToArray());
      int-Anzahl = 0;
      für (int i = 0; i < 10000; i++)
      {
        wenn (mysqlCommand.ExecuteNonQuery() > 0)
          zählen++;
      }
      Schließen SieConnect();
      mysqlCommand.Parameters.Clear();
      sw.Stopp();
      Zeitspanne ts2 = sw.Verstrichen;
      Console.WriteLine(ts2.TotalMilliseconds);
      Anzahl zurückgeben;
    }
    //Buchstabieren Sie 10.000 Insert-Anweisungen auf einmal und senden Sie sie auf einmal ab. public static void test4()
    {
      Stoppuhr sw = neue Stoppuhr();
      sw.Start();
      MySqlInstance.OpenConnect();
      MySqlTransaction tran = MySqlInstance.Connection.BeginTransaction();
      Zeichenfolgenbefehl = Zeichenfolge.Leer;
      für (int i = 0; i < 10000; i++)
      {
        Zeichenfolge temp = Zeichenfolge.Format("einfügen in test.testtable(pname,pwd) Wert ('{0}','{1}'); \r\n", "Name" + i, "Passwort." + i);
        Befehl += Temp;
      }
      MySqlInstance.InsertDataSql(Befehl);
      tran.Commit();
      MySqlInstance.CloseConnect();
      sw.Stopp();
      Zeitspanne ts2 = sw.Verstrichen;
      Console.WriteLine(ts2.TotalMilliseconds);
    }
 }

Schließlich wird ein Konsolenprogramm erstellt, um die drei Methoden zu testen, indem die Übermittlung von Transaktionen verwendet wird, Transaktionen nicht verwendet werden und 10.000 Einfügungen zu einer Transaktion verkettet werden, und um die benötigte Zeit auszudrucken. Das Ergebnis ist wie folgt:

Man kann Folgendes erkennen: Das Festschreiben von 10.000 Einfügungen mit Transaktionen dauerte nur 4,7 Sekunden, während es ohne Transaktionen 311 Sekunden dauerte und das Zusammenstellen von 10.000 Einfügeanweisungen 7,3 Sekunden dauerte. Die hier benötigte Zeit beträgt 7,3 Sekunden. Theoretisch sollte die Ausführung von Datenbank-SQL der Ausführung von Transaktionen ähneln. Die hier benötigte Zeit wird hauptsächlich für die Zeichenfolgenverkettung verwendet, die auf der Clientseite mehr Zeit in Anspruch nimmt.

Fügen Sie den Testprogrammcode ein:

System verwenden;
mit System.Collections.Generic;
mit System.Linq;
mit System.Text;
verwenden von System.Threading.Tasks;
mit MySql.Data;
Verwendung von MySql.Web;
mit MySql.Data.MySqlClient;
mithilfe von System.Diagnostics;
mit System.Data;
Namespace mysqlDEMO01
{
  Klassenprogramm
  {
    statischer void Main(string[] args)
    {      
      testInsert();
      Console.ReadLine();
    }
    //Verwenden Sie @, um den Anti-Injection-Parameter sicher einzufügen.
    öffentliche statische void testInsert()
    {
      Liste<MySqlParameter> lmp = neue Liste<MySqlParameter>();
      lmp.Add(neuer MySqlParameter("@pname", "hello2"));
      lmp.Add(neuer MySqlParameter("@pwd", "1232"));
      Zeichenfolgenbefehl = "in test.testtable(pname,pwd) Wert(@pname,@pwd) einfügen); ";
      MySqlInstance.InsertData(Befehl, lmp);
      Liste<MySqlParameter> lmp2 = neue Liste<MySqlParameter>();
      lmp2.Add(neuer MySqlParameter("@pname", "hello2"));
      lmp2.Add(neuer MySqlParameter("@pwd", "1232"));
      MySqlInstance.InsertDataNoTran(Befehl, lmp2);
      test4();
    }
   }
}

Zusammenfassen

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM. Wenn Sie mehr darüber erfahren möchten, schauen Sie sich bitte die folgenden Links an

Das könnte Sie auch interessieren:
  • Erste Schritte mit MySQL (IV) Einfügen, Aktualisieren und Löschen von Daten aus einer Tabelle
  • MySQL-Dateneinfügungsoptimierungsmethode concurrent_insert
  • Mysql aktualisiert bestimmte Felder einer anderen Tabelle basierend auf Daten aus einer Tabelle (SQL-Anweisung)
  • Warum ist der Speicherplatz nach dem Löschen von Tabellendaten in MySQL immer noch belegt?
  • Detaillierte Erläuterung der Idee des MySQL-Triggers zur Echtzeiterkennung einer Anweisung zum Sichern und Löschen
  • MySQL-Daten einfügen, aktualisieren und löschen Details

<<:  So installieren Sie JDK 13 in einer Linux-Umgebung mithilfe eines komprimierten Pakets

>>:  JavaScript+html zur Implementierung der Sliding-Verifizierung auf Front-End-Seiten (2)

Artikel empfehlen

Zeitleistenimplementierungsmethode basierend auf ccs3

In Webprojekten nutzen wir häufig die Zeitleisten...

JavaScript BOM erklärt

Inhaltsverzeichnis 1. BOM-Einführung 1. JavaScrip...

MySQL 8.X Installations-Tutorial unter Windows

Zuvor habe ich MySQL 5.7 verwendet, aber da MySQL...

Verwendung des Linux-Telnet-Befehls

1. Einleitung Der Befehl Telnet dient zur Anmeldu...

So führen Sie Linux-Befehle im Hintergrund aus

Wenn Sie einen Befehl im Terminal ausführen, müss...

Optimierungsanalyse der Limit-Abfrage in MySQL-Optimierungstechniken

Vorwort Im realen Geschäftsleben ist Paging eine ...

Mit CSS3 erstellter Hover-Zoom-Effekt

Ergebnis:Implementierungscode: html <link href...

Tutorial zur Installation von Ubuntu Server in Vmware

In diesem Artikel finden Sie das grafische Tutori...

Linux-Dateisysteme erklärt: ext4 und darüber hinaus

Heute werde ich Sie durch die Geschichte von ext4...

Analyse langsamer Einfügefälle aufgrund großer Transaktionen in MySQL

【Frage】 Die INSERT-Anweisung ist eine der am häuf...

7 native JS-Fehlertypen, die Sie kennen sollten

Inhaltsverzeichnis Überblick 1. Bereichsfehler 2....

SQL-Implementierung LeetCode (176. Zweithöchstes Gehalt)

[LeetCode] 176. Zweithöchstes Gehalt Schreiben Si...

Warum wird mir die Zugriffsschnittstelle für Docker Tomcat nicht angezeigt?

Frage: Kann der Ursprungsserver keine Darstellung...