0

私はいくつかのデータを保存するためにmysqlサーバーをセットアップしている最中ですが、(今週末少し読んだ後)データを時間内にアップロードするのに問題があるかもしれないことに気付きました。

私は基本的に複数のサーバーで毎日のデータを生成し、それを共有キューに送信して処理/分析しています。データは約 50 億行です (ただし、データは非常に小さく、ID 番号が列にあり、int の辞書が別の列にあります)。私が見たパフォーマンス レポートのほとんどは、10 時間以上かかる 60 ~ 100k/秒の挿入速度を示しています。その日にデータに取り掛かることができるように、非常に迅速にデータが必要であり、その後、データを破棄する (または S3 などにテーブルを達成する) ことができます。

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

私は innodb で mysql を使用するつもりでした (それが役立つ他の設定を使用できます) が、最終決定されていないため、mysql が機能しない場合は、他の何かがあります (以前に hbase を使用したことがありますが、最初に mysql ソリューションを探していました)。私が問題を抱えている場合、より広く使用され、助けを得やすいようです)?

4

1 に答える 1

1

わお。それはあなたがロードしている大量のデータです。これを正しく行うには、おそらくかなりの設計上の検討が必要です。

複数の MySQL サーバー インスタンスは、読み込み速度の向上には役立ちません。違いを生むのは、mySQL サーバー上の高速プロセッサ チップと非常に高速なディスク IO サブシステムです。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 サーバーのファイル システムにアクセスする必要があります。

部分的にロードされたテーブルをクエリする必要がない場合に限り、インデックス作成を無効にしてからテーブル全体をロードし、次にインデックス作成を再度有効にすることを検討する必要があります。

于 2012-04-23T00:13:39.323 に答える