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

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

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

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

MongoDB

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

PHP

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

AWS(Amazon Web Services)

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

Q&A

7回答

10433閲覧

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

markcrat

総合スコア46

MySQL

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

MongoDB

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

PHP

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

AWS(Amazon Web Services)

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

3グッド

11クリップ

投稿2016/04/04 14:40

編集2022/01/12 10:55

あるシステムで、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万アクセスは、コストが高すぎる

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

ikuwow👍を押しています

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

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

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

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

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

rkojima

2016/04/05 03:50

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

2016/04/05 06:26

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

回答7

0

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

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/04 17:12

KiyoshiMotoki

総合スコア4791

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

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

markcrat

2016/04/05 13:22

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

0

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

投稿2016/04/13 06:40

yshima

総合スコア16

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

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

0

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

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

投稿2016/04/12 14:02

300c

総合スコア12

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

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

0

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

投稿2016/04/12 07:23

takotakot

総合スコア1111

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

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

0

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

投稿2016/04/05 02:12

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

markcrat

2016/04/05 06:13 編集

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

2016/04/05 06:37

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

2016/04/05 09:44

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

0

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

投稿2016/04/04 14:51

編集2016/04/05 07:22
cateye

総合スコア6851

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

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

markcrat

2016/04/04 15:03

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

2016/04/05 09:53

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

2016/04/05 12:19

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

0

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

投稿2016/04/21 14:13

markcrat

総合スコア46

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問