人生のプチ美学を教えてください!!

最終的に1億行になるであろうテーブルを含むデータベースを作っています。
テスト環境はCentOS6.3 MySQL5.5 CPU QuadCore 2.4GHz 2GBメモリです。

テスト環境を作るために10万件づつのCSVファイルをインサートしていったところ最初の10万件は数秒でインサートできたのですが、だんだん重くなり、1000万件近くになると「10万件の登録に1分半」もの時間が掛かっています。
(1000万件のデータはinnoDB上で1.2GB)

サーバーを公開した場合、最大で1分間に数万件のインサートが見込まれていますので、今の環境だとテーブル内データ1千万件が限界の感じであり、現在予想している1億行では使い物にならないと危惧しています。

そのような中、調査していくとディーエヌエーの松信氏の発言で

http://www.slideshare.net/kaminashi/db-6636154

18. インメモリでINSERTを完結する
  インメモリでのINSERT性能 InnoDBの場合秒間15000 insert/s超え

という記載を発見しました。

しかし、インメモリでのインサートの方法というのが分かりません。

話の筋やInnoDBという単語から言って、松信氏の言う「インメモリでINSERTを完結する」と「インメモリー・データベース」とは違うと考えております。
実メモリの範囲内という考えなら、現在のテスト環境でも1.2GBのデータを2GBメモリのマシンで展開しているわけなので、「10万件の登録に1分半」かかる理由が分かりません。

秒間15000 insert/s超えを達成させる「インメモリでINSERTを完結」させる方法について具体的にご教授いただけませんでしょうか?

宜しくお願い致します。

A 回答 (2件)

>CPU使用率は40%ほどしかなく、メモリも余裕があるのに、IOだけが完全に溢れております。



となるとたんにファイルI/Oのボトルネックでしょうか・・・
遅延書き込みがうまく機能していないだけならバッファリングの調整で
少しは改善されるかもしれません。
ただ、結局書き込みがおいつかないなら、本質的にはハードウェアで処理するしかなく、
SSDやらでデータ管理しないと解決しないかもしれませんね。

検証については以下サイトなど参考になるとおもいますので、
諸々の変数を調整してみてはいかがでしょうか?
http://blog.layer8.sh/ja/2011/12/23/mysql%E3%82% …

また、MySQLのレイヤーによる負荷を軽減するためにHandlerSocketというプラグインも
あるようなので、場合によってはチャレンジしてみてもよいかもしれません。
(個人的には興味があるのですが未検証なので自己責任でお願いします)

http://engineer.dena.jp/2010/08/handlersocket-pl …
    • good
    • 0
この回答へのお礼

ご教授いただきありがとうございます。

>諸々の変数を調整してみてはいかがでしょうか?

はい、この部分についてはそれなりに調整していたのですが、どうもこの程度の小細工ではだめなようです。

>また、MySQLのレイヤーによる負荷を軽減するためにHandlerSocketというプラグインもあるようなので、場合によってはチャレンジしてみてもよいかもしれません。

情報ありがとうございます。
調べてみましたところ、まさにHandlerSocketこそが、ディーエヌエーの松信氏の発言にあったインメモリでINSERTを完結するそのもののようです。
HandlerSocket自体を松信氏が開発したようです。
いろいろ調べて、私の手に負えるようであれば使ってみたいと思います。

>SSDやらでデータ管理しないと解決しないかもしれませんね。

アドバイス通り、SSDで行きたいと考えています。
4K以下のランダムな書き込みが千回/秒あるという想定なのですが、4K write が310MB/s(HDの300倍!)も出てるので、これなら使えそうです。
http://review.kakaku.com/review/K0000431722/Revi …

また、同じような使用条件でソーシャルゲームを作っている方が、「1時間で28万PV(select)」かつ「柿拾い=350万(insert)」を行うようなゲームをSSDが難なくこなしているという記事も発見しました。

http://www.maido3.com/server/zousan/nikki175.html

ヒントを頂きまして大変ありがとうございました。

お陰さまで安心して開発を進められます。

有難うございました。

お礼日時:2013/02/01 23:03

>1.2GBのデータを2GBメモリのマシンで展開している



そういう単純計算ではないと思いますが・・・
インサート時のCPUやメモリの負荷をみれば、改善個所も変わってくるでしょう
私見ですが2GBメモリだと1億のデータを扱うには圧倒的にたりないと思います
あとはテーブルの構成をよほどうまく調整するしかないですね

インサートのスピードについては公式マニュアルを参考に

http://dev.mysql.com/doc/refman/5.1/ja/insert-sp …

この回答への補足

早速のご投稿ありがとう御座います。

>そういう単純計算ではないと思いますが・・・

そうですよね。私もそうだとも思ったのですが..

>私見ですが2GBメモリだと1億のデータを扱うには圧倒的にたりないと思います

あくまでテスト環境です。本番環境ではxeon5570(quad core 2.93 HT)X2連装(16スレッド)、メモリ16GBで対応予定です。

Quadcore2.4GHz 2GBメモリはあくまでテスト環境ですが、このテスト環境に1000万行の書き込みをしたところ、CPU使用率は40%ほどしかなく、メモリも余裕があるのに、IOだけが完全に溢れております。

種々のテスト結果、現状ではinsertは数千行/秒のイメージのため、raid10で対応しようとは思っていますが、それでも倍速にしかなりません。

そこで、ディーエヌエーの松信氏が言う秒間15000 insert/s超えを達成させる「インメモリでINSERTを完結」させる方法という言葉に期待して質問したところです。

ご記入頂きましたURLを拝見しましたが、残念ながらインメモリでINSERTの方法について触れられておりませんでした。

さらなる情報が御座いましたらご教授願いただきたくお願い申し上げます。

情報頂きましたこと御礼申し上げます。

補足日時:2013/01/31 12:08
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す