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 RabbitMQ クラスタ構築プロセス図

1. 全体的な手順冒頭で、RabbitMQ サービスをインストールして実行する方法を紹介しましたが、...

IDEA で Docker プロジェクトをデプロイする手順

現在、ほとんどのプロジェクトが Docker 上にデプロイされ始めていますが、デプロイのプロセスはま...

CSS3マスクレイヤーのくり抜き効果を実現するさまざまな方法

この記事では、マスク レイヤーの中空化を実現する 4 つの方法を紹介します。みんなと共有し、自分用の...

MySQL の主キーとトランザクションの詳細な説明

目次1. MySQLの主キーとテーブルフィールドに関するコメント1. 主キーと自動増分2. テーブル...

Ubuntu 20.04 をインストールした後に行うべきこと (初心者向けガイド)

Ubuntu 20.04 がリリースされ、多くの新機能が導入されましたが、慣れていない機能も多くあ...

Google Web Fonts でウェブサイトに無制限のフォントを追加

長い間、リソースの制約により、使用できるフォントが限られていたため、Web サイトの開発は妨げられて...

Axios を使用して Vue2 がリクエストを開始する詳細なプロセス記録

目次序文Axiosのインストールと設定シンプルなGETリクエストを開始するPOSTリクエストを行うシ...

テンプレートタグの使用方法の詳細な説明(Vue での使用方法の概要を含む)

目次1. HTML5のテンプレートタグ2. テンプレートタグ操作のプロパティとメソッド3. Vueの...

Vue+ElementUI で超大規模なフォーム例を処理する方法

最近、社内の業務調整により、以前の超長文のロジックが大幅に変更されたため、リファクタリングする予定で...

Vue でコミュニケーションを実装する 8 つの方法

目次1. コンポーネント通信1. Props 親コンポーネント ---> 子コンポーネント通信...

Vue ページ監視ユーザープレビュー時間機能実装コード

最近のビジネスでは、オンライン トレーニング システムが特定のオンライン プレビュー ページに対する...

フォームの「Enter」、「Submit」、「Enter != Submit」を削除する方法

「Enter != Submit」問題を実装するには、通常、「ボタンの種類」と「入力ボックスの数」か...

MySQL InnoDBとMyISAMの違いを簡単に理解する

序文MySQL は、myisam、innodb、memory、archive、example など、...

MySQLの実行原理、論理階層化、データベース処理エンジンの変更について詳しく説明します

長い間 MySQL を使ってきたので、SQL 文はすでに覚えていると思います。そこで、その実行原理を...

ページネーションの例とベストプラクティス

<br />構造と階層により複雑さが軽減され、読みやすさが向上します。記事やサイトが整理...