MySQL バッチ挿入ループの詳細なサンプルコード

MySQL バッチ挿入ループの詳細なサンプルコード

背景

数日前、MySql でページングを行っていたときに、ページングに制限 0,10 を使用するとデータが失われるというブログ投稿を見ましたが、別の人はそうはならないと言っていたので、自分でテストしたいと思いました。テスト中にデータがなかったので、MySql をインストールしてテーブルを作成しました。10 万件のテストデータを一括挿入する while ループを作成したところ、実行時間が耐え難いものになったので、一括挿入を最適化する方法を見つけるために情報を探しました。ここにメモしました。

データ構造

標準列はページング中に主キー列、インデックス列、共通列の 3 つのシナリオに分割されるため、テスト テーブルにはこれらの 3 つのシナリオを含める必要があります。テーブル作成構文は次のとおりです。

`test`.`t_model` が存在する場合はテーブルを削除します。

テーブル `test`.`t_model`( を作成します。 
 `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自動増分主キー',
 `uid` bigint COMMENT 'ビジネス主キー',
 `modelid` varchar(50) COMMENT '文字主キー',
 `modelname` varchar(50) COMMENT 'name',
 `desc` varchar(50) COMMENT '説明',
 主キー (`id`)、
 ユニークインデックス `uid_unique` (`uid`)、
 キー `modelid_index` (`modelid`) BTREE の使用
)ENGINE=InnoDB 文字セット=utf8 照合=utf8_bin;

操作を容易にするために、挿入操作ではストアド プロシージャを使用して while ループを通じて順序付けられたデータを挿入し、他の操作方法やループ方法のパフォーマンスは検証されません。

実行プロセス

1. 最も簡単な方法を使用して、1W 項目を直接ループして挿入します。構文は次のとおりです。

my_procedure が存在する場合はプロシージャを削除します。 
区切り文字 //
プロシージャ my_procedure() を作成する
始める
 n int DEFAULT 1 を宣言します。
 n < 10001 の場合
 t_model (uid,modelid,modelname,`desc`) に値 (n,CONCAT('id20170831',n),CONCAT('name',n),'desc') を挿入します。 
 n = n + 1 と設定します。
 終了しながら;
終わり
// 
              区切り文字 ;

10,000 個のデータを挿入する場合の実行時間は約 6 分 7 秒です。この速度では、1,000 万個のデータを挿入するには数日かかります。

2. では、トランザクションコミットの追加を検討してみましょう。パフォーマンスは向上しますか?テストは 1000 レコードごとにコミットします。構文は次のとおりです。

区切り文字 //
プロシージャ u_head_and_low_pro() を作成する
始める
 n int DEFAULT 17541 を宣言します。
 n < 10001 の場合
   t_model (uid,modelid,modelname,`desc`) に値 (n,CONCAT('id20170831',n),CONCAT('name',n),'desc') を挿入します。 
   n = n + 1 と設定します。
   n % 1000 = 0の場合 
   それから
    専念;
   終了の場合;
 終了しながら;
終わり
//
区切り文字 ;

実行時間は6分16秒で、コミットなしで実行した場合とあまり変わりません。この方法でのバッチ挿入のパフォーマンスは非常に低いようです。

3. ストアド プロシージャを使用してバッチ挿入ステートメントを生成し、バッチ挿入を実行して 10,000 件のレコードを挿入します。構文は次のとおりです。

u_head_and_low_pro が存在する場合はプロシージャを削除します。
区切り文字 $$
プロシージャ u_head_and_low_pro() を作成する
始める
 n int DEFAULT 1 を宣言します。
 @exesql を 't_model (uid,modelid,modelname,`desc`) の値に挿入' に設定します。
 @exedata を '' に設定します。
 n < 10001 の場合
 @exedata を concat(@exedata,"(",n",","'id20170831",n,"','","name",n,"','","desc'",")"); に設定します。
 n % 1000 = 0の場合 
 それから
  @exesql を連結(@exesql,@exedata、";")に設定します。
  @exesql から stmt を準備します。
  ステートメントを実行します。
  DEALLOCATE準備ステートメント;
  専念; 
  @exesql を 't_model (uid,modelid,modelname,`desc`) の値に挿入' に設定します。
  @exedata を "" に設定します。
 それ以外
  @exedata を concat(@exedata,',') に設定します。
 終了の場合;
 n = n + 1 と設定します。
 終了しながら;
終了;$$ 
区切り文字 ;

実行時間は3.308秒です。

要約する

バッチで挿入する場合は、挿入値のバッチメソッドを使用して挿入すると、実行速度が大幅に向上します。

上記は、編集者が紹介したMySQLバッチ挿入ループの詳細なサンプルコードです。皆様のお役に立てれば幸いです。ご質問がある場合は、メッセージを残してください。編集者がすぐに返信します。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。
この記事が役に立ったと思われた方は、ぜひ転載していただき、出典を明記してください。ありがとうございます!

以下もご興味があるかもしれません:
  • MySQL に大量のデータを挿入する 4 つの方法の例
  • MYSQL バッチ挿入データ実装コード
  • MySQL でバッチ挿入を実装してパフォーマンスを最適化するチュートリアル
  • ユニークインデックスを使用したMySQLバッチ挿入を回避する方法
  • MySQLは挿入を使用して複数のレコードを挿入し、データを一括で追加します。
  • MySQL バッチデータ挿入スクリプト
  • MySQL バッチ SQL 挿入パフォーマンス最適化の詳細な説明
  • MySql バッチ挿入の最適化 SQL 実行効率の例の詳細な説明
  • MySQLバッチは関数ストアドプロシージャを通じてデータを挿入します

<<:  Vue プロジェクトを使用して複数のプロキシを構成する際の注意事項

>>:  VMwareがLinuxシステムをインストールして起動した後に黒い画面が表示される問題を解決する

推薦する

Docker Machineの詳細な説明

Docker と Docker Machine の違いDocker はクライアント サーバー アーキ...

コード分​​析を実現するためのFastDFSとNginxの統合

FastDFSとNginxの統合:トラッカーは、負荷分散と高可用性のために Nginx と組み合わせ...

フロントエンドJavaScriptの約束

目次1. Promiseとは何か2. 基本的な使い方3. Promiseメソッド3.1 Promis...

TypeScriptジェネリックの使用

目次1. 使いやすい2. 関数内でジェネリックを使用する3. クラス内でジェネリックを使用する4. ...

WeChatアプレットのサイレントログインとカスタムログイン状態の維持の詳細な説明

目次1. 背景2. サイレントログインとは何ですか? 3. カスタムログイン状態を維持する方法4. ...

HTML での位置の使用に関する簡単な紹介

昨日 HTML を少し学んだばかりで、JD.com の検索バーを作るのが待ちきれませんでした。 作っ...

HTMLページのヘッダーコードは完全に明確です

以下のコードはすべて <head>...</head> の間にあり、具体的な...

MySQL ステートメントの実行順序と書き込み順序の例の分析

選択ステートメントの完全な構文は次のとおりです。 選択 DISTINCT <選択リスト>...

vue router-view のネストされた表示実装

目次1. ルーティング構成2. Vueページのネスト3. ネストされた関係1. ルーティング構成 定...

Tomcat と WebLogic で純粋な HTML ファイルを展開するプロセスの分析

1. まず、純粋なHTMLファイルにはindex.htmlというエントリが必要です。 2. Tomc...

iframe の多層ネスト、無制限のネスト、高度に適応したソリューション

ページ A、B、C の 3 つがあります。ページ A にはページ B が含まれ、ページ B にはペー...

40以上の美しいWebフォームデザイン例

Web フォームは、訪問者と Web サイト所有者間の主要なコミュニケーション チャネルです。フィー...

Nginx をベースに特定の IP への短期アクセス数を制限する

特定の期間内に特定の IP へのアクセス回数を制限する方法は、特に悪意のある DDOS 攻撃に直面し...

Python で pymysql モジュールを使用して MySQL データベースに接続する

pymysqlをインストールするpip install pymysql 2|0pymysqlの使用2...

Vue はネストされたルーティングメソッドの例を実装します

1. ネストされたルーティングはサブルーティングとも呼ばれます。実際のアプリケーションでは、通常、ネ...