MySQL データ挿入効率の比較

MySQL データ挿入効率の比較

データを挿入するとき、以前オフィス システムに取り組んでいたときにはデータベースのパフォーマンスについてまったく考慮していなかったことに気付きました。関係するデータの量が少ないため、時間と効率は明らかではありませんでした。しかし、データ量が非常に多く、1 秒あたり 10,000 回の挿入が必要になるほどになると、SQL ステートメントを考慮する必要があります。 100 個のデータを挿入する場合、考えられるデータ挿入方法は以下のとおりです。

1: ループを 100 回実行し、データを何度も挿入します。一度接続して 100 回挿入します。これは最も時間がかかり、IO と接続を最も多く消費します。

2: 100 個のデータ挿入ステートメントを 1 つの SQL ステートメントに結合し、一度接続してデータを挿入します。この方法は最初の方法よりも時間がかかります。

3: トランザクションを使用し、100 回挿入して最後のトランザクションをコミットします。この方法は、2 番目の方法よりも高速です。

4: 挿入ステートメント自体を使用して複数のデータを挿入します。

上記の方法を少量のデータに適用した場合、ほとんど違いはなく、まったく感じられません。ただし、データ量が少し多い場合、たとえば一度に 10,000 個のデータの場合。挿入のスピードと効率が出ます。

これはmysqlインスタンスクラスです。このインスタンスはmysql接続とデータベース関連の操作を提供します。

パブリッククラス MySqlInstance
  {
    //接続文字列 private static string mySqlConnectionStr = "Server = localhost; Database = test; Uid = root; Pwd = password.1;";
    プライベート静的 MySqlConnection _mysqlConnect;
    プライベート静的MySqlConnection mysqlConnect
    {
      得る
      {
        (null == _mysqlConnect)の場合
        {
          _mysqlConnect = 新しい MySqlConnection(mySqlConnectionStr);
        }
        _mysqlConnect を返します。
      }
    }
    プライベート静的 MySqlCommand _mysqlCommand;
    プライベート静的 MySqlCommand mysqlCommand
    {
      得る
      {
        if (null == _mysqlCommand)
        {
          _mysqlCommand = mysqlConnect.CreateCommand();
        }
        _mysqlCommand を返します。
      }
    }
    //接続を開く public static void OpenConnect()
    {
      mysqlConnect() を開きます。
    }
    //接続を閉じる public static void CloseConnect()
    {
      mysqlConnect.Close();
    }
    パブリック スタティック MySqlConnection 接続
    {
      得る
      {
        mysqlConnect を返します。
      }
    }
    // アンチインジェクション方式でデータを挿入します // トランザクション 10000 を使用して挿入し、最後にトランザクションを 1 回コミットします public static int InsertData(string Command, List<MySqlParameter> Params)
    {
      // プログラム時間監視 Stopwatch sw = new Stopwatch();
      //プログラムタイミング開始sw.Start();
      オープンコネクト();
      //トランザクションの開始 MySqlTransaction trans = mysqlConnect.BeginTransaction();
      mysqlCommand.CommandText = コマンド;
      mysqlCommand.Parameters.AddRange(Params.ToArray());
      整数カウント = 0;
      (int i = 0; i < 10000; i++) の場合
      {
        (mysqlCommand.ExecuteNonQuery() > 0) の場合
          カウント++;
      }
      //トランザクションのコミット trans.Commit();
      CloseConnect();
      mysqlコマンドのパラメータをクリアします。
      //タイマーが停止します sw.Stop();
      TimeSpan ts2 = sw.Elapsed;
      Console.WriteLine(ts2.TotalMilliseconds);
      カウントを返します。
    }
    //クエリの結果は MySqlDataReader に返されます。接続を使用する場合は、接続を閉じることはできません。public static MySqlDataReader SelectData(string sql)
    {
      ストップウォッチ sw = new Stopwatch();
      sw.Start();
      // OpenConnect();
      MySqlCommand newcommond = 新しい MySqlCommand(sql, mysqlConnect);
      MySqlDataReader データ = newcommond.ExecuteReader();
      // CloseConnect();
      sw.停止();
      TimeSpan ts2 = sw.Elapsed;
      Console.WriteLine(ts2.TotalMilliseconds);
      データを返します。
    }
    /// <要約>
    /// クエリの結果はデー​​タセットになります/// </summary>
    /// <パラメータ名="sql"></パラメータ>
    /// <戻り値></戻り値>
    パブリック静的データセットSelectDataSet(文字列sql)
    {
      MySqlCommand newcommond = 新しい MySqlCommand(sql, mysqlConnect);
      MySqlDataAdapter アダプタ = 新しい MySqlDataAdapter();
      アダプタ.SelectCommand = newcommond;
      データセット ds = 新しいデータセット();
      アダプタ.Fill(ds);
      ds を返します。
    }
    // インジェクションによる安全でない挿入 public static int InsertDataSql(string sql)
    {
      // OpenConnect();
      mysqlCommand.CommandText = sql;
      int count = mysqlCommand.ExecuteNonQuery();
      // CloseConnect();
      カウントを返します。
    }
    //@を使用してパラメータを安全に挿入します
    //トランザクションを使用せずに 10,000 回挿入する public static int InsertDataNoTran(string Command, List<MySqlParameter> Params)
    {
      ストップウォッチ sw = new Stopwatch();
      sw.Start();
      オープンコネクト();
      mysqlCommand.CommandText = コマンド;
      mysqlCommand.Parameters.AddRange(Params.ToArray());
      整数カウント = 0;
      (int i = 0; i < 10000; i++) の場合
      {
        (mysqlCommand.ExecuteNonQuery() > 0) の場合
          カウント++;
      }
      CloseConnect();
      mysqlコマンドのパラメータをクリアします。
      sw.停止();
      TimeSpan ts2 = sw.Elapsed;
      Console.WriteLine(ts2.TotalMilliseconds);
      カウントを返します。
    }
    // 10,000 個の挿入ステートメントを一度に入力し、一度に送信する public static void test4()
    {
      ストップウォッチ sw = new Stopwatch();
      sw.Start();
      MySqlInstance.OpenConnect();
      MySqlTransaction tran = MySqlInstance.Connection.BeginTransaction();
      文字列コマンド = 文字列.Empty;
      (int i = 0; i < 10000; i++) の場合
      {
        string temp = string.Format("test.testtable(pname,pwd) に挿入します。値 ('{0}','{1}'); \r\n", "name" + i, "password." + i);
        コマンド += temp;
      }
      MySqlInstance.InsertDataSql(コマンド);
      tran.Commit();
      MySqlInstance.CloseConnect();
      sw.停止();
      TimeSpan ts2 = sw.Elapsed;
      Console.WriteLine(ts2.TotalMilliseconds);
    }
 }

最後に、トランザクションの送信を使用する方法、トランザクションを使用しない方法、10,000 個の挿入を連結してトランザクションを形成する方法の 3 つの方法をテストし、かかった時間を印刷するコンソール プログラムが作成されます。結果は以下のようになります。

トランザクションを使用すると、10,000 回の挿入をコミットするのに 4.7 秒しかかかりませんでしたが、トランザクションを使用しない場合は 311 秒かかり、10,000 回の挿入ステートメントを組み立てるのに 7.3 秒かかりました。ここでかかった時間は 7.3 秒です。理論的には、データベース SQL の実行はトランザクションを使用する場合と似たものになるはずです。ここでかかった時間は主に文字列の連結に使用され、クライアント側ではより多くの時間がかかります。

テストプログラムコードを貼り付けます:

システムの使用;
System.Collections.Generic を使用します。
System.Linq を使用します。
System.Text を使用します。
System.Threading.Tasks を使用します。
MySql.Data を使用します。
MySql.Web を使用します。
MySql.Data.MySqlClient を使用します。
System.Diagnostics を使用します。
System.Data を使用します。
名前空間 mysqlDEMO01
{
  クラスプログラム
  {
    静的void Main(文字列[] 引数)
    {      
      テスト挿入();
      コンソールの行を読み取ります。
    }
    //@ を使用して、アンチインジェクション パラメータを安全に挿入します。
    パブリック静的 void testInsert()
    {
      リスト<MySqlParameter> lmp = 新しいリスト<MySqlParameter>();
      lmp.Add(新しいMySqlParameter("@pname", "hello2"));
      lmp.Add(新しいMySqlParameter("@pwd", "1232"));
      文字列コマンド = "test.testtable(pname,pwd) に挿入します。値(@pname,@pwd); ";
      MySqlInstance.InsertData(コマンド、lmp);
      リスト<MySqlParameter> lmp2 = 新しいリスト<MySqlParameter>();
      lmp2.Add(新しいMySqlParameter("@pname", "hello2"));
      lmp2.Add(新しいMySqlParameter("@pwd", "1232"));
      MySqlInstance.InsertDataNoTran(コマンド、lmp2);
      テスト4();
    }
   }
}

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。

以下もご興味があるかもしれません:
  • MySQL 入門 (IV) テーブルへのデータの挿入、更新、削除
  • MySQL データ挿入最適化メソッドconcurrent_insert
  • MySQL は、あるテーブルのデータに基づいて別のテーブルの特定のフィールドを更新します (SQL ステートメント)
  • MySQL でテーブル データを削除した後もディスク領域がまだ占有されているのはなぜですか?
  • バックアップと削除のためにリアルタイムでステートメントを検出するMySQLトリガーの考え方の詳細な説明
  • MySQLデータの挿入、更新、削除の詳細

<<:  圧縮パッケージを使用して Linux 環境に JDK 13 をインストールする方法

>>:  フロントエンドページのスライド検証を実装するための JavaScript + HTML (2)

推薦する

Linuxでユーザーが所属するグループを変更する方法

Linuxでユーザーが所属するグループを変更する1. ユーザーのグループを設定する usermod ...

クラウド サーバー Ubuntu_Server_16.04.1 に MySQL をインストールしてリモート接続を有効にする方法

1. MySQLをインストールします。対応するソフトウェアをインストールするには、次の 3 つのコマ...

デザイン理論:テキスト表現とユーザビリティ

<br />テキストデザインでは、通常、テキストのレイアウト、つまりテキストをより美しく...

間違った MySQL コマンドをキャンセルしたい場合はどうすればいいですか?

間違った mysql コマンドを入力したのでキャンセルしたいです。どうすればいいですか? ctrl ...

VMWare を使用して Windows 上で Linux 環境を構築する手順 (画像とテキスト)

Mac を返却して以来、元のラップトップは使用されていません。このラップトップの構成は非常に良好で...

CSS変数var()の使い方を理解する必要があります

Web プロジェクトがどんどん大きくなると、CSS は天文学的な大きさと複雑さを増します。この問題を...

Vue-cliはプロジェクトを作成し、プロジェクト構造を分析します

目次1. ディレクトリを入力してプロジェクトを作成する2. 必要な設定項目を選択します2.1 Vue...

Linux の MariaDB データベースについて

目次Linux の MariaDB データベースについて1. データベースとは何ですか? 2. デー...

CSSオーバーフローメカニズムについての簡単な説明

CSS オーバーフローのメカニズムを詳細に学ぶ必要があるのはなぜですか?実際の開発プロセスでは、コン...

nginx を使用したプロキシ サーバーの設定

Nginx は、リバース プロキシ機能を使用して負荷分散を実装できるほか、フォワード プロキシ機能を...

MySQL におけるデータタイムとタイムスタンプの違い

MySQL には 3 つの日付型があります。日付(年-月-日)テーブル test(hiredate ...

dockerにmysqlをインストールした後にNavicatが接続できない問題に対する完璧な解決策

1. Dockerがイメージをプルするdocker pull mysql (デフォルトで最新バージョ...

Windows 10 と MySQL 5.5 のインストールとインストールなしの使用の詳細なチュートリアル (画像とテキスト)

この記事では、Windows 10環境でのMySQL 5.5のインストールと使用方法を紹介します。リ...

ドキュメントの場所の比較

<br />2 年前に PPK が投稿した素晴らしいブログ記事では、contains()...

Mysql general_log をクリーンアップする方法の概要

方法1: グローバル general_log を 'OFF' に設定します。 テーブ...