MySql バッチ挿入の最適化 SQL 実行効率の例の詳細な説明

MySql バッチ挿入の最適化 SQL 実行効率の例の詳細な説明

MySql バッチ挿入の最適化 SQL 実行効率の例の詳細な説明

itemcontractprice の数は 10,000 程度で、itemcontractprice ごとに 5 つのログが挿入されます。

updateInsertSql.AppendFormat("UPDATE itemcontractprice AS p INNER JOIN foreigncurrency AS f ON p.ForeignCurrencyId = f.ContractPriceId SET p.RemainPrice = f.RemainPrice * {0},p.BuyOutPrice = f.BuyOutPrice * {0},p.ReservedPrice = f.ReservedPrice * {0},p.CollectedPrice = f.CollectedPrice * {0},p.AccessPrice = f.AccessPrice * {0} WHERE p.CurrencyId = {1} AND p.date BETWEEN '{2:yyyy-MM-dd}' AND '{3:yyyy-MM-dd}';", rate.ExchangeRate, exchangeRate.CurrencyId, rate.BeginDate, rate.EndDate); 
 
updateInsertsql.AppendFormat( "ITEMS" ITEMCONTRACTPRICELOG`( `ContractPriceType`、` ContractPrice`、 `fccontractPrice`、` sexpire`、 `logremark`、` recreatedbyname`、 `createdbyid`、` recreateddate`、 `regtyid`、` rogtypeid`、 `、` regtypeid」 「CurrencyId」、 `ContractPriceid`、 `Stockpattern`、` itemid`)select 0、c.remainprice、f.remainprice、c.remainisexpire、 '外币汇率调整、'、 'job'、0、now() c.foreigncurrencyId = f.contractpriceidのf.currencyId = {0}とc.date '{1:yyyy-mm-dd}'と '{2:yyyy-mm-dd}'; "、endycangerate.currencyid、rate.begindate、rate.endte); 
 
updateInsertsql.AppendFormat( "ITEMS" ITEMCONTRACTPRICELOG`( `ContractPriceType`、` ContractPrice`、 `fccontractPrice`、` sexpire`、 `logremark`、` recreatedbyname`、 `createdbyid`、` recreateddate`、 `regtyid`、` rogtypeid`、 `、` regtypeid」 「CurrencyId」、 `ContractPriceid`、 `stockpattern`、` itemid`)select 1、c.buyoutprice、f.buyoutprice、c.buyoutisexpire、 '外币汇率调整、重新计算人民币底价'、 'job'、0、now()、5、c foreigncurrencyid = f.contractpriceid where c.currencyid = {0}とc.date '{1:yyyy-mm-dd}'と '{2:yyyy-mm-dd}'; "、endcangerate.currencyid、rate.begindate、rate.endte); 
 
updateInsertsql.AppendFormat( "ITEMS" ITEMCONTRACTPRICELOG`( `ContractPriceType`、` ContractPrice`、 `fccontractPrice`、` sexpire`、 `logremark`、` recreatedbyname`、 `createdbyid`、` recreateddate`、 `regtyid`、` rogtypeid`、 `、` regtypeid」 「CurrencyId」、 `ContractPriceid`、 `stockpattern`、` itemid`)select 2、c.ReservedPrice、c.ReserveDisexpire、 '外币汇率调整、'、 'job'、0、now() f on C.ForeignCurrencyId = f.ContractPriceid WHERE C.CURRENCYID = {0}とc.date '{1:yyyy-mm-dd}'と '{2:yyyy-mm-dd}'; "、exchangerate.currencyid、rate.begindate、rate); 
 
updateInsertsql.AppendFormat( "ITEMS" ITEMCONTRACTPRICELOG`( `ContractPriceType`、` ContractPrice`、 `fccontractPrice`、` sexpire`、 `logremark`、` recreatedbyname`、 `createdbyid`、` recreateddate`、 `regtyid`、` rogtypeid`、 `、` regtypeid」 「CurrencyId」、 `ContractPriceid`、 `Stockpattern`、` itemid`)select 3、c.collectedprice、c.collectedisexpire、 '外币汇率调整、'、 'job'、0、now()、5、c.providerid、c.priced、c.date、c c.foreigncurrencyId = f.contractpriceidのf.currencyId = {0}とc.date '{1:yyyy-mm-dd}'と '{2:yyyy-mm-dd}'; "、endycangerate.currencyid、rate.begindate、rate.endte); 
updateInsertsql.AppendFormat( "ITEMS" ITEMCONTRACTPRICELOG`( `ContractPriceType`、` ContractPrice`、 `fccontractPrice`、` sexpire`、 `logremark`、` recreatedbyname`、 `createdbyid`、` recreateddate`、 `regtyid`、` rogtypeid`、 `、` regtypeid」 「CurrencyId」、 `contractPriceid`、 `stockpattern`、` itemid`)select 4、c.accessprice、f.accessprice、c.accessisexpire、 '外币汇率调整、'、 'job'、0、now() c.foreigncurrencyId = f.contractpriceidのf.currencyId = {0}とc.date '{1:yyyy-mm-dd}'と '{2:yyyy-mm-dd}'; "、endycangerate.currencyid、rate.begindate、rate.endte); 
//var curContractPriceList = itemContractPriceList.Where(o => o.CurrencyId == exchangeRate.CurrencyId && o.Date >= rate.BeginDate && o.Date <= rate.EndDate).ToList(); 
logger.InfoFormat("予約価格の更新とログSQL:{0}", updateInsertSql.ToString()); 
//if (curContractPriceList.Count == 0) 続行します。 
int 効果行 = 0; 
(var tran = UnitOfWorkManager.Begin()) を使用します 
{ 
  effctRows = taskRepository.ExecuteSql(updateInsertSql.ToString(), false); 
  tran.Complete(); 
} 
logger.InfoFormat("最低入札価格の更新によって影響を受ける行数: {0}", effctRows); 

通常は約20秒かかります。

以前は、クエリに EF を使用していましたが、時間がかかりました。その後、更新ステートメントを組み立てて、ログを挿入しました (データごとに 5 つのログ)。ネットワークのやり取りの時間とデータベース接続を開いて閉じる時間を加えた合計実行時間は約 10 分でした。

バッチ操作に SQL ステートメントを使用すると、効率が 40 倍向上しますが、大量のデータの送信とデータベース処理回数には時間がかかります。

したがって、ソフトウェア開発は、開発を完了することだけではなく、開発の高度な段階であるパフォーマンスの問題を解決することも重要です。

読んでいただきありがとうございます。お役に立てれば幸いです。このサイトをサポートしていただきありがとうございます。

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

<<:  dockerカスタムイメージでphp7をビルドする方法

>>:  JS を使用して配列内の要素の存在を 10 分で判断する

推薦する

Dockerイメージの作成、アップロード、プル、デプロイを理解するための記事

目次1. 画像1. 鏡とは何ですか? 2. 画像の構成と目的(1) Dockerファイル(2)スクラ...

MySQL 中断された接続警告ログの分析

序文:場合によっては、MySQL に接続されたセッションが異常終了することが多く、エラー ログに「通...

JavaScript メッセージ ボックスの例

JavaScript では、警告ボックス、確認ボックス、プロンプト ボックスの 3 種類のメッセージ...

Element UI を使用してページにページング ナビゲーション バーを追加する方法

必要ページング バーを追加します。これにより、ページにジャンプしたり、ページ番号に従って特定のページ...

JavaScript - Vue でのスロットの使用: スロット

目次Vue でのスロットの使用: slotスコープ付きスロット: テンプレートタグで囲む要約するVu...

Docker イメージのインポートとエクスポートのコード例

Dockerイメージのインポートとエクスポートこの記事では、移行、バックアップ、アップグレードなどの...

dockerでマウントされたディレクトリが読み書きできない問題を解決する

次のコマンドを使用してコンテナを作成し、ローカルの /home/dock/Downloads ディレ...

docker コマンド例外「権限が拒否されました」の解決方法

Linuxシステムでは、dockerを新しくインストールし、次のようなコマンドを入力します。dock...

Web デザイン ヘルプ: Web フォント サイズ データ リファレンス

<br />内容はインターネットから転載したものです。どこから見つけたのか忘れてしまいま...

継続的インテグレーションテストにおけるDocker Swarmの適用の詳細な説明

背景アジャイル モデルは広く使用されており、テストは特に重要です。新しいバージョンは頻繁にリリースす...

Vue ライフサイクルの紹介とフック関数の詳細な説明

目次Vueライフサイクルの紹介とフック機能VUEライフサイクルフックVue ライフサイクルの紹介作成...

ウェブサイトのビジュアルデザイン(画像とテキスト)における情報伝達の役割と方法

現代の Web ビジュアル デザインは、初期の情報の積み重ねから、その後のグラフィックスと抽象化、そ...

React Nativeでaxiosを使用してネットワークリクエストを行う方法

フロントエンド開発では、Ajax、jQuery ajax、axios、fetch など、データ要求を...

高同時実行シナリオにおける nginx 最適化の詳細な説明

日常の運用・保守作業では、nginx サービスが頻繁に使用され、nginx の高同時実行性によって生...

Nginx 急ぎ購入 電流制限構成 実装分析

ビジネス上のニーズにより、急ぎの購入が発生することが多いため、ロード バランシング フロント エンド...