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システムをインストールして起動した後に黒い画面が表示される問題を解決する

推薦する

nginx で複数のフロントエンド プロジェクトをデプロイするいくつかの方法

nginx を使用して 1 つのサーバーに複数のフロントエンド プロジェクトをデプロイする 3 つの...

文字列の GBK および GB2312 エンコードとデコードのフロントエンド実装 (概要)

序文プロジェクトを開発しているときに、かなり厄介な問題に遭遇しました。この製品では、判断のためにブラ...

Linux usermod コマンドの使用

1. コマンドの紹介usermod (ユーザー変更) コマンドは、ユーザー アカウントを変更するため...

Windows に Docker をインストールする詳細なチュートリアル

ローカルの MySQL バージョンが比較的低いため、最近 MySQL のバージョンをアップグレードす...

Vueルーティングナビゲーションガードの簡単な理解

目次1. グローバルガード1. グローバル前線警備2. グローバル解像度ガード3. グローバルポスト...

JavaScript のフラット配列をツリー構造に変換する例

目次バックグラウンドで10,000個のデータが失われた再帰法非再帰的方法要約するバックグラウンドで1...

vite2.0+vue3 モバイルプロジェクトの詳細な説明

1. 関連する技術的なポイントバイト版ヴュー3 ts統合ルーティングvuexを統合するAxiosを統...

MySQL トランザクション同時実行問題の解決

開発中にこのような問題に遭遇しましたビデオ視聴記録が 100 に更新されると、視聴されたことを意味し...

CSS でコンテンツが長すぎる問題を解決する方法の詳細な説明

CSS を記述するときに、デザインに存在する重要なケースを忘れてしまうことがあります。たとえば、コン...

CSS3実践手法のまとめ(推奨)

1. 丸い境界線: CSSコードコンテンツをクリップボードにコピー境界線の半径: 4px ; 2....

モバイルブラウザが位置をサポートしない場合の解決策: 修正

具体的な方法は以下の通りです。 CSSコードコードをコピーコードは次のとおりです。 .wap_bot...

JavaScript オブジェクトの組み込みオブジェクト、値型、参照型の説明

目次物体オブジェクト定義オブジェクトのメンバーを反復処理するJS組み込みオブジェクト数学オブジェクト...

Linux 上の MySQL 5.7 でパスワードを忘れる問題を解決する

1. 問題Linux 上の mysql5.7 のパスワードを忘れました2. 解決策• ステップ 1:...

HTML テーブルの使い方 (Web ページの視覚効果を表示する)

NetEase Blog で HTML を使用する場合、テンプレートに直接コードを追加できることは...

MySQLに挿入する前にデータが存在するかどうかを確認する方法

ビジネスシナリオ: 訪問者の訪問状況を記録する必要があるが、繰り返し記録することはできない挿入する前...