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

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

ただいまの
回答率

88.04%

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

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 5,569

score 25

MySQLに関しての質問です。

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

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る