背景 数日前、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 ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。 以下もご興味があるかもしれません:
|
<<: Vue プロジェクトを使用して複数のプロキシを構成する際の注意事項
>>: VMwareがLinuxシステムをインストールして起動した後に黒い画面が表示される問題を解決する
方法 1: <input id= "File1" type= "...
データベース内のテーブルのフィールドとプロパティをエクスポートし、テーブルを作成してWordに保存す...
聞く: CSS を使用してハイパーリンクのスタイルを設定しましたが、ホバーしても機能しません。なぜこ...
Java で ffmpeg を呼び出してビデオ形式を flv に変換する方法の詳細な説明注:以下のプ...
複雑なテーブル構造では、一部のセルが水平方向に複数のセルにまたがるため、行間属性 ROWSPAN を...
目次1. はじめに2. 本文2.1 フィールドの連結2.2 フィールドでの算術計算の実行1. はじめ...
私は最近、多くの音楽に特化した Linux ディストリビューションの 1 つである Audiovis...
序文Linux では「すべてがファイル」であることは誰もが知っているので、ファイルのオープン状態を確...
質問docker で gdb を実行すると、ブレークポイントに到達しますが、ブレークポイントに入るこ...
1. デフォルトのポート8080に加えて、ドメイン名のアクセスとserver.xmlのオープンにポー...
定義と使用@media クエリを使用すると、さまざまなメディア タイプに異なるスタイルを定義できます...
目次序文1. 技術原理1.1 レイアウト1.2 コンポーネント1.3 ステータス1.4 イベント1....
1. レンダリングを見る進むを選択: 後方を選択: コードは次のとおりです(例): <テンプレ...
問題の説明: Macを購入し、初めてMySQLをインストールしました。初期パスワードが分かりません。...
1. 準備1.1 service.bat を含む tomcat 圧縮パッケージをダウンロードします。...