1億件(40GB以上)が入っているテーブルに対して、参照及び更新の処理をしようと考えています。
現状、MySQL5.1+SATA HDD(7200rpm)をRAID0+1で構築+Windows XP+3GB memoryの構成で処理しています。
現状、処理を実行すると、相当遅くなります。インデックスが効かない処理もありますので、莫大な時間が掛かります。
多角的に分析したいので、なるべく短時間に1億件の分析が終わると大変助かります。
個人レベル(コストは30万以下、最大でも50万以下)で、もっとも早く処理ができる方法論をアドバイス頂けると大変助かります。
ちなみに、Windows以外ではLinuxとFreeBSDが使えます。
宜しくお願いします。
まず重要なのは何がボトルネックになっているのか?です。
これが明確にならないと最小の投資で最大の効果は得られません。
過去に似たような事を試した時には、ディスクと解析処理がボトルネックになったため下記の対策をしました。
一時的な処理向けですので日々の運用には向いていません。
また、プライオリティは下がりますが
といった対応も考えられます。
最後に解析処理の見直しは効果がありました。
具体的には
といったような内容です。
■OS
WindowsXPのままであれば実質、ファイルキャッシュの調整くらいしか出来ないので
Linux or FreeBSDでMySQLを動作させるのに必要最低限の構成でセットアップする。
32bit よりも 64bitのほうが望ましい。
セキュリティソフトやネットワークも邪魔になるのでスタンドアローンで動作させるのが望ましい。
■MySQL
テーブルは出来るだけ分けたい所。理想はファイルキャッシュに収まるサイズ。
インデックスが効かない処理に合わせられないか、非正規化はどうかなど再考。
エンジンはトランザクション不要であるならばMyISAMを選択。
InnoDBよりもMyISAMのほうがデータ容量を半減できるのでディスクアクセスの面でも有利。
あとはファイルキャッシュやソートキャッシュなどは極力大きく取り、ログは最低限だけ出力。
etc・・・細かくは下記などを参照。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 6 最適化
■ハードディスク
OS用HDD1台 + DB用高速SSD1台
(PCI-Express接続の超高速SSDもあるけど高価なのでSATA接続のSSD)
■CPU、メモリ、ビデオカード
Core i7
メモリはトリプルチャネルで詰めるだけ
メモリのパフォーマンスを確保したいのでチップセット内臓ビデオではなく別付けとする。
以上、とりあえず費用は最小限。最初の回答として、たたき台としてお使いください。
※ コメント欄開いていれば、コメント欄に書いたのだけど開いてなかったので回答で失礼。
詳しいご説明どうもありがとうございます。
昔は、パソコン雑誌を頻繁に買っていたのですが、今仕事が忙しくて最近の技術情報に疎くなっていますので助かります。
>32bit よりも 64bitのほうが望ましい。
メモリーの上限が実質ないので64bitを検討したいのですが、何があったときに切り分けが難しいので躊躇しています。
> InnoDBよりもMyISAMのほうがデータ容量を半減できるのでディスクアクセスの面でも有利。
> あとはファイルキャッシュやソートキャッシュなどは極力大きく取り、ログは最低限だけ出力。
データ容量を半減できるのは知りませんでした。どうもありがとうございます。
> OS用HDD1台 + DB用高速SSD1台
SSDとSAS(15000rpm)だとどちらが速いでしょうか?
SSDでRAIDを組んで4台くらいストライピングするというのもいいですね。
多分、自分の処理は、ディスクアクセスがネックになるので、それが一番速くする方法でしょうか。
>Core i7
申し遅れました。現在、それを積んでいます。
とても、参考になりました。ありがとうございます。
まず重要なのは何がボトルネックになっているのか?です。
これが明確にならないと最小の投資で最大の効果は得られません。
過去に似たような事を試した時には、ディスクと解析処理がボトルネックになったため下記の対策をしました。
一時的な処理向けですので日々の運用には向いていません。
また、プライオリティは下がりますが
といった対応も考えられます。
最後に解析処理の見直しは効果がありました。
具体的には
といったような内容です。
とても参考になりました。
1台でやろうとせず、複数台で構成された Hadoop と HBase に移して処理してみてはいかがでしょうか?
ありがとうございますた。ただ、少し大がかりのような気がします。
これからアプリを組むのならこんなのもアリでしょうか。
amazonが提供するクラウドを利用するものです。
使ったCPU時間分の課金になります。
なので、解析処理をする頻度によっては割高になってしまうと思います。
http://kzk9.net/blog/2009/04/reviewing_amazon_elastic_map_reduce...
面白そうですね。個人でもこのようなシステムが使えるようになったのですね。参考になります。
>1億件(40GB以上)が入っているテーブル
1テーブルになってるものを10テーブルに単純に分ける。
これに伴い、現状の処理を書き換えないと駄目ですが、
確実に早くなります。
予算があるのなら、MySQL5.1からORACLEに変えたほうがやっぱり早いです。
ありがとうございます。
とても参考になりました。