4

MySql データベースがあります。多くのレコード (約4,000,000,000行) があり、それらを削減するためにそれらを処理したい (約1,000,000,000行に削減)。

次のテーブルがあるとします。

  • table RawData : RawData に挿入したい 1 秒あたり 5000 行を超える行があります

  • table ProcessedData : このテーブルは、RawData で挿入された行の処理済み (集約) ストレージです。 最小行数 > 20,000,000

  • table ProcessedDataDetail : テーブル ProcessedData (集計されたデータ) の詳細を書き込みます

    ユーザーは、 8つ以上の他のテーブルに参加する必要があるProcessedDataテーブルを表示および検索したいと考えています。RawData への挿入と ProcessedData での検索 (ProcessedData INNER JOIN ProcessedDataDetail INNER JOIN ...) は非常に遅いです。多くのインデックスを使用しました。私のデータの長さは1Gですが、インデックスの長さは4Gです:)。(私はこれらのインデックスを乗り切りたいと思っています。それらは私のプロセスを遅くします)

このプロセスの速度を上げるにはどうすればよいですか?

ProcessedDataのシャドウ テーブルが必要だと思います。名前はProcessedDataShadowです。次に RawData を処理して ProcessedDataShadow で集計し、結果をProcessedDataShadowProcessedDataに挿入します。あなたの考えは??

(私はC++でプロジェクトを開発しています)

前もって感謝します。

4

2 に答える 2

3

あなたの実際のアプリケーションが何であるかについて詳しく知ることなく、私はこれらの提案があります:

  1. まだ使用していない場合は、InnoDB を使用してください。InnoDB は行ロックを利用し、同時更新/挿入の処理がはるかに優れています。同時に作業しないと遅くなりますが、RawData のソースがいくつあるかにもよりますが、行ロックはおそらく必須です。

  2. 通常、インデックスを使用すると速度が向上しますが、インデックスの選択を誤ると速度が低下する可能性があります。それらを取り除きたいとは思いませんが、多くのインデックスは挿入を非常に遅くする可能性があります。挿入のたびにインデックスが更新されないようにするために、データのバッチを挿入するときにインデックスを無効にすることができます。

  3. データ収集を妨げる可能性のある膨大な量のデータを選択する場合は、読み取り専用の複製されたスレーブ データベース サーバーの使用を検討してください。それによって行/テーブルがロックされても、プライマリ (マスター) データベースは影響を受けず、スレーブは解放されるとすぐに元の速度に戻ります。

  4. データベース内のデータを処理する必要がありますか? 可能であれば、アプリケーション内のすべてのデータを収集し、ProcessedData のみを挿入してください。

于 2011-06-14T08:14:04.773 に答える
2

データの構造、統合方法、ユーザーがデータを利用できるようにする必要がある速さ、統合プロセスがどれだけでこぼこになるかについては、まだ述べていません。

ただし、最も差し迫った問題は、毎秒 5000 行をシンクすることです。非常に大きく、非常に高速なマシン (おそらくシャード クラスター) が必要になります。

可能であれば、統合バッファを作成して (DBMS ではなくメモリ内ハッシュ テーブルを使用して) 統合データを格納することをお勧めします (部分的にしか統合されていない場合でも)。 rawData から直接入力します。

実際、生データと統合データを別々のサーバー/クラスターに分離することを検討したいと思います (MySQL 連合エンジンは、データの統一されたビューを提供するのに便利です)。

クエリを分析して、本当に必要なインデックスを確認しましたか? (ヒント -このスクリプトはこれに非常に役立ちます)。

于 2011-06-14T08:46:54.473 に答える