質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

3回答

2000閲覧

MySQLで一度に大量のinsertを投げるとSleepになります

Razumerians

総合スコア25

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

1クリップ

投稿2016/09/28 13:57

編集2016/09/28 14:04

MySQLに関しての質問です。

様々なプログラムから1つのDB(同じテーブル)に対して大量のinsertを投げています。

show fullprocess を見ると、多くのinsertがsleepになっているのですが、
これは1DBあたりのクエリ受付可能数(?)がキャパシティを超えているからでしょうか?

Sleepを解消する事で、さらに大量のデータを高速にinsertする事は可能でしょうか?

その方法やアイデアなどあれば教えてください。

ちなみにバルクインサートはしていますが、そもそもDBにアクセスしている端末数が多い為、このような状態になっているのかもしれません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

show fullprocess を見ると、多くのinsertがsleepになっているのですが、

これは1DBあたりのクエリ受付可能数(?)がキャパシティを超えているからでしょうか?

insert を並列実行できないのでは?
たとえば、一意制限のあるカラムがあれば、並列実行は不可能ですよね。
インデックスの更新も並列実行できないものと思われます。
一意制限もインデックスも無いとしても、トランザクションの分離レベルを
さげないと並列実行は許されないような気がします。

ちなみにバルクインサートはしていますが、そもそもDBにアクセスしている端末数が多い為、このような状態になっているのかもしれません。

  1. 端末からの要求を受けたスレッドはinsert要求をキューに詰める(何番目の要求かを示す番号をもらって待つ)
  2. 別のスレッドでキューから一定量ずつ取り出してバルクインサートする
  3. インサートが終わったら何番目まで進んだかをアナウンスする
  4. 待っていたスレッドはアナウンスされた番号が自分の番号より大きければ、成功を返す

というようなことをすれば速度は上がるかもしれません。スレッドが重い処理系で上記のようなことをやると、大量のメモリが必要になったり、遅くなったりするかもしれません。Javascriptとか Go とか c10k対応の処理系でないと厳しいかもしれません。しかし、今大量に Sleep になっても耐えられているのであれば、大丈夫かも。

投稿2016/09/28 14:36

mit0223

総合スコア3401

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

エンジンはInnoDBでしょうか?MyISAMだとロックがきびしいかも
indexやらuniqueもデータ投入時には負担になる場合もあります。
どうせみんなSLEEPになって終わらないなら、制限を最小限にした
一時保管テーブルに投入し、その後定期的に本チャンに流し込むような
予約制をとって並行で処理しないという考え方もあるでしょう

投稿2016/09/29 00:31

yambejp

総合スコア114747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

大量のデータってピークの単位時間にどの程度のデータがINSERTされて、その多重度は?
ひとつのテーブルへの書き込みが集中しているのがボトルネックになってるのなら、hash partition で分散を図ることも考えらます。
以前、OracleでLOBの書き込みがボトルネックになっていて、LOBを別テーブルにしてTABLESPACEも変えたら?ってアドバイスしたこともあります。それでどの程度パフォーマンスが改善されたかのレスはありませんでしたが。
現状で許容時間内に処理が終わればSLEEPがあってもとりあえず良しとして、将来データ量が増えた時の対応点としてグループで認識できていれば良いでしょう。

時々とっても非力なハードウェアで大量のデータを処理しようとしているお客様がいて、1トントラックに10トンの荷物を積むような真似は止めましょう、って言わざるを得ないこともあります。

投稿2016/09/28 18:42

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問