
最終的に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を完結」させる方法について具体的にご教授いただけませんでしょうか?
宜しくお願い致します。
No.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 …
ご教授いただきありがとうございます。
>諸々の変数を調整してみてはいかがでしょうか?
はい、この部分についてはそれなりに調整していたのですが、どうもこの程度の小細工ではだめなようです。
>また、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
ヒントを頂きまして大変ありがとうございました。
お陰さまで安心して開発を進められます。
有難うございました。
No.1
- 回答日時:
>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の方法について触れられておりませんでした。
さらなる情報が御座いましたらご教授願いただきたくお願い申し上げます。
情報頂きましたこと御礼申し上げます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessでデータシートに同じデ...
-
テーブルで一番古いレコードだ...
-
結合テーブルでINSERTする方法...
-
ビューのソートについて
-
処理の途中で停止させ、再開さ...
-
SQLでの前検索・後検索
-
CSVファイルを毎日、全レコード...
-
アクセス レコードセットを更...
-
このISAMでは、リンクテーブル・・
-
ERROR1062:Duplicate entry.......
-
Oracleで上書きImportはできま...
-
ACCESSで容量が50MBになった...
-
SQL文の結合(一対多)がわから...
-
重複レコードの一括削除
-
テーブル作成について
-
sql serverのテーブルレイアウ...
-
access 特定のレコード数までエ...
-
ORA-01401が表示され、データが...
-
ユニオンクエリで複数ファイル...
-
Excelを使用してSQLServerに接続
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessでデータシートに同じデ...
-
Oracleで上書きImportはできま...
-
ビューのソートについて
-
Accessのテーブルデータを一気...
-
テーブルで一番古いレコードだ...
-
アクセス レコードセットを更...
-
マテリアライズドビューとスナ...
-
ORA-01401が表示され、データが...
-
このISAMでは、リンクテーブル・・
-
accessでレコード更新直後の反...
-
結合テーブルでINSERTする方法...
-
ERROR1062:Duplicate entry.......
-
IF NOT EXISTを使用するINSERT文
-
削除したテーブルを元に戻すこ...
-
「クリップボードにコピーされ...
-
left joinなどで結合対象のレコ...
-
ACCESS2010の最適化が中断される
-
ODBC接続で新しいレコードを追...
-
構文エラー : 演算子がありませ...
-
処理の途中で停止させ、再開さ...
おすすめ情報