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)

推薦する

Web デザイン体験: 5 つの優れた Web デザイン コンセプトの完全分析 (画像)

他の種類のデザインとは異なり、Web デザインは時代の発展とともに常に変化しています。したがって、W...

MySQLアカウントのパスワード変更方法(概要)

序文:データベースを日常的に使用すると、パスワードが単純すぎて変更する必要がある場合、パスワードの有...

jsのイベントオブジェクトを深く理解しましょう

JS でよく使用されるイベントは次の通りです。ページイベント: load;フォーカス イベント: フ...

Linux の sudo 脆弱性により不正な特権アクセスが発生する可能性がある

Linux で新たに発見された sudo の脆弱性を悪用すると、特定のユーザーが root としてコ...

MySQL 学習: 初心者のための 3 つのパラダイム

目次1. パラダイム基盤1.1 パラダイムの概念2. 3つの主要なパラダイム2.1 3つの主要なパラ...

H5レイアウト実装手順における天井と底部の吸引を解決するための純粋なCSS

どのような製品について言及したいですか?最近、ユーザーがマーケティングの変化をよりよく観察できるよう...

Docker 実行時にユーザーとグループを管理する方法

Docker はプロセスを中核としてシステムリソースを分離する管理ツールです。分離は、オペレーティン...

eCharts でパーセンテージ付きの横棒グラフを実装する方法

目次サンプルコードレンダリングコード分​​析要約するサンプルコード var データ = [220, ...

純粋な CSS3 マインドマップ スタイルの例

マインドマップ彼はおそらく次のように見えるでしょう: インターネット上の実装のほとんどは d3.js...

DockerでVueプロジェクトをデプロイする方法を教えます

1.前面に書きます:軽量仮想化テクノロジーとして、Docker には継続的インテグレーション、バージ...

MySQLの基本操作を詳しく解説(第2部)

序文この記事には1. データベースのいくつかの主要な制約2. テーブル間の関係制約:主キー制約: 機...

ページにスクロールバーが表示されたときに、スクロールバーがページ幅に影響しないようにする方法

本体の幅をウィンドウの幅に設定します(次のスクリプトで制御されます) $("body&qu...

WeChatアプレットで数字当てゲームを実装する実際のプロセス

目次機能紹介レンダリング1. ホームページレンダリング用のコード(index03) 2. ゲーム開始...

Vue で webSocket を使用してリアルタイムの天気を更新する方法

目次序文webSocket の操作と例について:ウェブソケット1. webSocketについて2. ...

HTMLはWEB標準の開発の中心的な基盤です

HTML 中心のフロントエンド開発は、ほぼ Web 標準の意味です。共通しているのは「分離」という考...