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

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

ただいまの
回答率

87.59%

MySQLの処理速度を上げたいですが可能ですか?

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 1,307

こんにちは、質問があるのですが、知恵をお貸しいただけますと幸いです。

現在、MySQLのDBサーバにアクセスして、Update文をFor文で何回も処理を投げています。

あるカラムの数字を+1インクリメントするようなUpdate文を投げています。

今のところ、速度的には1秒あたり25件の処理が可能です。

これをもっと速くしたいと考えているのですが、どのような方法がありそうでしょうか?
(my.cnfファイルの修正など)
マシンの部品に関する話でも知りたいと思います(CPUのコア数など)。

教えていただけますと幸いです。よろしくお願いいたします。

SQLは以下となります。

UPDATE `DB`.`table_1` SET `remaining_count_charge` = `remaining_count_charge` - 1, `total_count` = `total_count` + 1 WHERE `id` = 1;";
UPDATE `DB`.`table_1` SET `remaining_count_charge` = `remaining_count_charge` - 100, `total_count` = `total_count` + 100 WHERE `id` = 1;";


とすれば、100回繰り返すことと同じことに成るということは承知しております。1回ずつ、処理を行いたいのです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • HisashiSakamoto

    2019/04/10 23:39

    サーバとの回線速度に関しては、

    ・TomcatサーバからリモートDBサーバにUpdate文を送る場合は、1件あたり0.041秒
    ・TomcatサーバとDBサーバが同じマシンの場合で、Update文を送る場合は1件あたり0.018秒

    となりました。2倍速度が改善されたので、少し参考にしようと思います。

    キャンセル

  • HisashiSakamoto

    2019/04/10 23:43

    >その1件の性能はどうやって計っているんですか?

    JSP内にFor文でUpdate文をDBサーバに投げる処理を行い、System.currentTimeMillis()で時刻を取得し、その時刻差をFor繰り返し回数で割ってページに表示しています。

    キャンセル

  • asahina1979

    2019/04/11 18:43

    jsqにゴリゴリコードを書いてるのか、

    100回繰り返し出なければいけない理由とは?

    キャンセル

回答 3

checkベストアンサー

+1

なぜ、100回同じクエリを投げたいのか理由がわかれば、別の回避策があるような気がしますが。

とりあえず複数回アップデートを流す場合の性能向上としてバッチアップデートというのがあります。

性能測定サンプルが以下にありましたので、試してみてはどうでしょうか。

JDBC Batch insert update MySQL Oracle

昔は、MySQLはJDBC内でforループするだけだったので、効果期待できないとあったのですが、
どうやらサポートされたのかもしれない。
動作確認したわけでないので、ダメもとでやってみたらよいかと。

あ、あと最初に書きましたが100回同じクエリー流す意図がわかれば、違う回避策あるかもしれません。

===
追記

実はある人がブラウザのあるページにアクセスすると、(リロードしなくても)5秒に1回このSQLが自動で動くようなページを作っています。
もし、これが100人が同時にこのページにアクセス中だとおおよそ0.05秒に1回このSQLが動くということになります。
この更新に耐えうる方法を期待しています。

その要件だとSQLが動かなくなる条件がないように思えますので、最終的にとんでもない数の更新になるのでは?
まぁ、その話は置いといて・・・
この場合だと、メモリ上に同期されたカウンタだけ用意して、定期的に1回アップデートで十分かなぁ。
カウンタの更新はDBより負荷が低いので余裕だと思います。
ロードバランシングしても、それぞれがカウンタを管理すればいけるかと

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/04/15 23:51

    遅くなり、すいません。
    実はある人がブラウザのあるページにアクセスすると、(リロードしなくても)5秒に1回このSQLが自動で動くようなページを作っています。
    もし、これが100人が同時にこのページにアクセス中だとおおよそ0.05秒に1回このSQLが動くということになります。
    この更新に耐えうる方法を期待しています。

    ちなみに、アクセスログをとっているのではないので、ログ解析の必要は生じません。

    キャンセル

  • 2019/04/16 10:23

    その要件は、質問に追記した方がよい回答を期待できるかと思います。

    キャンセル

  • 2019/04/19 22:40

    皆様ありがとうございました。

    最終的には、Staticな配列を用意して、そこにレコード1個を1個の要素として逐次入れていって、配列のSizeが100に達したら、SQLを発行するという方法を考えました。
    これですとSQL100回を1回で済ませられそうです。
    もちろん、1000回でも実行時間は10倍になりますが、それほど影響はなさそうでした。

    「メモリ上に同期」というのがヒントとなりました。

    キャンセル

+1

質問が単純にUPDATE文の性能を上げるという事なら、環境の性能上げるしかないんじゃないでしょうか。
どのような環境なのかも記述されておりませんので、具体的な話での回答にはなりませんが、仮想環境ならCPUコアの割り当てとかメモリの割り当てを増してみるとか。
それから、書き込みが高速なストレージに変更するとかネットワーク機器の見直しとか。

ここまで書きましたが、先にチューニングすべきは、そのUPDATEを含む一覧処理のチューニングだと思いますけどね。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/04/10 23:23

    SSDやテープにすれば早くなるかもしれませんね。
    コア数は16個とか多ければ良さそうですが、まだ試してないです。
    ネットワーク機器は、NuroでCat.6ケーブルなのですが一応DBサーバとTomcatサーバが同じマシンの中にあればこれらは考慮しなくてもいいということになりそうです。

    キャンセル

  • 2019/04/11 08:42

    ボトルネックを消さずにボトルネックを解消死体といってるように見える(誤字あり)

    キャンセル

  • 2019/04/11 15:03

    @asahina1979 さん
    質問者さんは、そのコメントもこの回答に対してと思うかもしれません。
    正直どういえば、伝わるのか分かりません。

    キャンセル

  • 2019/04/12 07:36

    おうふ。スマホで誤爆してたか

    キャンセル

0

LAST_INSERT_ID を使ってみては?あまり改善できないかもしれませんが。
用途がわかると AUTO_INCREMENT で良いのでは?などと適切な回答が付き易いのでは?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/04/09 12:42

    少し調べて見ます。

    キャンセル

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

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

関連した質問

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