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

So öffnen Sie eine Seite in einem Iframe

Lösung: Setzen Sie den Zielattributwert des Links ...

Tutorial zur manuellen Installation von MySQL 8.0.13

In diesem Artikel finden Sie das Tutorial zur man...

So benennen Sie die Tabelle in MySQL um und worauf Sie achten müssen

Inhaltsverzeichnis 1. Tabellenmethode umbenennen ...

So konfigurieren Sie mehrere Tomcats mit Nginx-Lastausgleich unter Linux

Die Methoden zur Installation von Nginx und mehre...

Detaillierter Prozess zum Upgrade von gcc (Version 10.2.0) in der CentOS7-Umgebung

Inhaltsverzeichnis Kurze Einleitung 1. Überprüfen...

Tic-Tac-Toe-Spiel in reinem CSS3 implementiert

Wirkung der Operation: html <div Klasse="...

40 Webseiten-Designs mit supergroßen Schriftarten

Heutige Webdesigns neigen dazu, sehr große Schrif...

MySQL- und SQLYog-Installationstutorial mit Bildern und Text

1. MySQL 1.1 MySQL-Installation mysql-5.5.27-winx...

JS implementiert die Drag- und Platzhalterfunktionen von Elementen

In diesem Blogbeitrag geht es um eine Schwierigke...

Installieren Sie MySQL offline mit RPM unter CentOS 6.4

Verwenden Sie das RPM-Installationspaket, um MySQ...