2012-04-22 11 views
0

私はいくつかのデータを保存するためにmysqlサーバを設定していますが、(今週末に少し読んだ後に)データを時間内にアップロードすることに問題があるかもしれません。複数のサーバを使用してmysqlのデータアップロードのパフォーマンスを向上させることはできますか?

私は基本的に複数のサーバが毎日のデータを生成し、その後、分析/処理するために、共有キューに送信しています。データは約50億行です(ただし、非常に小さいデータ、列のID番号、別の列のintのディクショナリ)。私が見てきたほとんどのパフォーマンスレポートでは、60〜100k /秒の挿入速度が10時間以上かかることが示されています。私たちは非常に迅速にデータを必要とするので、その日に作業してから廃棄してもいいです(あるいはテーブルをS3または何かに達成するかもしれません)。

どうすればよいですか?私は自由に(データベースサーバに加えて)8台のサーバを用意していますが、何とかそれらを使ってアップロードを高速化できますか?最初に私はそれらを使って同時にデータをサーバーにプッシュすることを考えていましたが、私はそれぞれのデータを読み込んで、分離したすべてのデータを1つのサーバーにマージしようと考えていましたか?

私はinnodbでmysqlを使用するつもりでした(他の設定を使用することもできます)が、最終的なものではないので、mysqlがうまく動作しない場合は別のものがあります(前にhbaseを使用しましたが、私は問題がより広範に使用され、より簡単に助けを受けるように見える場合は、最初のMySQLのソリューション)?

答えて

1

ワウ。それはあなたが読み込んでいるデータの多くです。この権利を得るには、おそらくかなりのデザイン思考に値するでしょう。

複数のmySQLサーバーインスタンスは、読み込み速度の向上に役立ちません。違いは、高速なプロセッサー・チップと、非常に高速なディスク入出力サブシステムがmySQLサーバー上にあることです。 64ビットプロセッサを使用して多くのRAMをプロビジョニングできる場合は、大きなテーブルに対してMEMORYアクセスメソッドを使用することができますが、これは実際には非常に高速です。 (それはあなたのために働くなら、巨大なJavaのHashMapのは、より良い動作する可能性があります。)

は自問:なぜあなたはSQL-照会可能テーブルでこの情報を隠しておく必要がありますか?データを読み込んだら、データをどのように使用しますか?あなたは、単一の行または数十億行の数行を取得するたくさんのクエリを実行しますか?または、テーブルの大部分を分割して集計クエリ(例:SUM(something) ... GROUP BY something_else)を実行しますか?

データが不完全に読み込まれているときにデータにアクセスする必要がありますか?または、最初のアクセスの前にバッチ全体のデータをロードできますか?

すべてあなたのクエリはテーブル全体を粉砕する必要があり、インデックスを使用しないでください。それ以外の場合はしかし、必要のないインデックスを投げ込まないでください。彼らは、あなたに負荷のパフォーマンス、大きな時間を費やすつもりです。

このテーブルにはInnoDBではなくmyISAMを使用することを検討してください。 myISAMのトランザクションセマンティクスが不足すると、読み込みが高速になります。 myISAMは、集約クエリまたは少数列クエリのいずれかを処理する上でうまく機能します。

あなたはおそらく、あなたがテーブルの名前を変更するか、単に新しいテーブルにアクセスするいずれかの方法で、昨日のデータの「取り除く」ことができますので、毎日のデータに別々のテーブルを持っていると思います。

LOAD DATA INFILEコマンドの使用を検討する必要があります。

http://dev.mysql.com/doc/refman/5.1/en/load-data.html

このコマンドは、MySQLサーバのファイルシステムからファイルを読み込むと、テーブルに直接それをバルクロードするためにMySQLサーバーが発生します。他のマシンのクライアントプログラムからINSERTコマンドを実行するよりも高速です。しかし、実稼働環境でセットアップするのは面倒です。共有キューは、ロードするデータファイルを書き込むためにmySQLサーバのファイルシステムにアクセスする必要があります。

部分的に読み込まれた表を照会する必要がない場合にのみ、索引付けを無効にしてから表全体をロードしてから索引を再度有効にすることを検討してください。

関連する問題