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

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

ただいまの
回答率

90.48%

  • PHP

    20912questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • MySQL

    6038questions

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

  • AWS(Amazon Web Services)

    2094questions

    Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

  • MongoDB

    251questions

    MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

1秒で1万件のステータス更新する手法

受付中

回答 7

投稿 編集

  • 評価
  • クリップ 11
  • VIEW 3,561

markcrat

score 38

あるシステムで、1秒間に1万件の状態更新(int型)が必要な要求定義があります。
総レコード件数は、1000万レコードで、1リクエスト1レコードの書き換えが、1秒間に1万リクエスト飛んでくるというものです。
24時間中15時間でこの更新が走り続けます。
フィールドは、(id bigint , subid bigint , stat tinyint)となっており、
update hoge set stat = 'STAT' where id = 'ID' and subid='SUBID';
で更新します。

手法として考えられるのは、以下のようなところかな、と思いますが、
アイデアなどありましたらよろしくお願いします。

A インメモリDB(MysqlMEMORYエンジンなど)をサーバーに立ち上げる
  デメリット:Mysql再起動で全レコード消失。レプリカが作れない。

B key-value型のDBをサーバー内に立ち上げる
  デメリット:障害発生時、即時対応が必要??

C AWSのDynamoDB
  デメリット:1秒1万アクセスは、コストが高すぎる

何かいい方法ないものかなー、といろいろ思案していますが、どれも一長一短で、
これといったものがなくて困っています。
よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • rkojima

    2016/04/05 12:50

    「1リクエストで1万レコード書き換え」 or 「1レコード書き換えを1万リクエスト」どちらでしょう? また総レコード件数はどれくらいの規模のテーブルに対しての処理でしょうか。

    キャンセル

  • markcrat

    2016/04/05 15:26

    ありがとうございます。詳細を質問文に追記いたしました。

    キャンセル

回答 7

+5

お使いの環境がどのようなものか不明なので確かなことは言えませんが、何か、サーバの性能とは別の要因でパフォーマンスがあがっていないように思います。

1万件だと10秒くらいかかってしまいます。

は、さすがに遅すぎると感じますので。

まずは、パフォーマンスがあがらない原因を突き止めるのが先かと思います。
MySQLの実行性能は(MySQLに限った話ではありませんが)、サーバの性能の他に

  • インデックスの有無
  • SQLの書き方
  • SQLを実行するプログラムの書き方
  • MySQLの設定値

などに影響されます。
まずは、これらについて問題ないか確認してみてはいかがでしょうか?
(個人的には、単にUPDATE文でインデックスが効いていないだけではないか?と予想しています。)

参考になりそうなページを、以下に紹介させていただきます。
http://nippondanji.blogspot.jp/2009/03/mysqlexplain.html
http://nippondanji.blogspot.jp/2009/02/mysql10.html

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/05 22:22

    ありがとうございます。とても参考になります。

    キャンセル

+2

有償ソフトウェアでよければCache' (InterSystems社)を使うと軽く実現できそうですがいかがでしょう。1000万件のレコードを作るのに手元のデスクトップマシン(Core i3-4130 3.4GHz)で28秒。その中の10000レコードをランダムに上書きまたは追加するのに0.027秒でした。(ネットワーク接続のオーバーヘッドは除いてです。) ジャーナリングはデフォルトで有効ですし、レプリケーションなどの機能を利用しても大きく性能は損なわないと思います。
フリーソフトウェアが必要ならGlobals (InterSytems社)あるいは GT.M (F.I.S.社)という手があります。MySQLとかとは違う世界なので、いろいろな意味で難しいかもしれませんが、性能については折り紙付きです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

勘違いしているなら読み飛ばしてください。
int(4byte)のupdate 1000回の更新であれば1秒あれば十分だと思いますが?
MySQL の UPDATE 文は書き方でパフォーマンスが変わる
・・追記・・
1日に5億からのアップデートをするのであれば、負荷分散(サーバでする事、クライアント側ですることなど)を真剣に検討してください。また、1秒で終わってほしい処理なら、300ms(30%)ぐらいで終わるようにしないと、回線やサーバの負荷が変わると問題が出ます。・・・今あるシステムで実現可能かどうかの見極めも必要です。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/05 00:03

    1万件の間違いでした。すいません!

    ありがとうございます。URL見ました。
    このスピード、AWSのEC2では、最速のIOPS20000でも無理のようでして、
    1万件だと10秒くらいかかってしまいます。
    メンテナンス性も考慮すると、EC2で実現できれば最高なんですけどね。

    キャンセル

  • 2016/04/05 18:53

    例えば、こちらのページ http://aws.amazon.com/jp/rds/aurora/faqs/ に
    「Amazon Aurora は 500,000 セレクト/秒および 100,000 アップデート/秒のパフォーマンスを示しました」と
    書かれているので、
    1日5億件程度のアップデートでは、負荷分散が不要な時代に突入したのでは、
    と思ったりするのですが、それでも、やはり負荷分散を検討すべきでしょうか?

    (へんな質問返しですいません)

    キャンセル

  • 2016/04/05 21:19

    負荷分散と言うと難しそうですが、要はクライアントで出来る事(sqlの構文最適化や回線負荷の削減など・・・もっとあるかも)は、クライアント側でやりましょうd^^ というだけです。・・・DB設計も視野に入っているのでしょうか? であれば、プライマリキーやインデックスなどデータの持ち方も考えなくてはなりませんね・・・すでに考慮済みであればご容赦mm 
    私は”話半分”派なので、10万→5万で見ちゃいますがw・・・回線速度など他の要因を考えた場合、それだけのパフォーマンスがほんとに出るのでしょうか? 

    キャンセル

  • 2016/04/06 01:15

    こちらのページ http://aws.amazon.com/jp/rds/aurora/faqs/#performance に
    http://d0.awsstatic.com/product-marketing/Aurora/RDS_Aurora_Performance_Assessment_Benchmarking_v1-2.pdf
    へのリンクがあるのですが再現できそうです。
    早く、負荷分散やリソースの節約を何も考えずにシステム構築できる時代がやってきてほしものです。...("= =) トオイメ目

    キャンセル

+1

具体的でなくてもうしわけないですが、分割でしょうか。当然デメリットもあるのですが。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/05 15:11 編集

    ありがとうございます。
    保守性を考えて、できれば分割せずに一つのDBで集中管理したいです。
    耐障害性も満たしたいので、もし、awsのRDSのAuroraで
    総レコード件数1000万レコード、内、1万件を1秒でステータス更新できれば、
    採用となるのですが。
    (1秒だけで終了する更新ではなく、1万件1秒の更新が、24時間中15時間くらい連続します)

    キャンセル

  • 2016/04/05 15:37

    (* 10000 3600 15)
    540,000,000 @@;
    ・・・が、一年中でしょうか?

    キャンセル

  • 2016/04/05 18:44

    そうです。今時なら、結構ありえるかと思います。

    キャンセル

+1

MySQL Memory であれば、レプリケーションができます。ある程度ディスクに残す必要があれば、レプリケーション先を InnoDB にすれば、残せそうです。ただし、レプリケーションが追い付かないといけないので、
Master (Memory) -> Slave (Memory) -> Backup (InnoDB) のようにして、Master 障害時には Slave でどうにかして、その後 Backup が追い付いてくる感じになるでしょうか。ただ、transaction log もすごいので、実際にできるかはちょっと分かりませんね…。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

DBの設計に関する回答が出ているので
ちょっと違った視点から。
的外れだったら無視して下さい。

1回のSQLで1行の更新なら、limit 1つけると処理速度変わりますよ。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

教えて頂いて、ありがとうございました。
いろいろ試していきます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

関連した質問

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

  • PHP

    20912questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • MySQL

    6038questions

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

  • AWS(Amazon Web Services)

    2094questions

    Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

  • MongoDB

    251questions

    MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。