1

私はMySQLのパーティショニングが初めてなので、どんな例でも大歓迎です。

複数の MyISAM テーブルに分散されたデータの一種のエージング メカニズムを作成しようとしています。

私の質問には、実際にはいくつかのサブ質問が含まれます。

関連するテーブルは次のとおりです。

  1. 最初のテーブルには、入力頻度の高い生データが含まれています (各レコードの隣には、自動インクリメントされた ID があります)。
  2. 2 番目のテーブルには、処理された結果が含まれます。生データ レコードごとに結果レコードがあります (結果レコードには、生データ レコードの自動インクリメント フィールドのソース ID レコードが含まれます)。

質問:

  1. 生データ テーブルと結果データ テーブルを同様に分割して、どちらも 1 つのパーティションに 10 週間のデータのみが含まれるようにする必要があります (各生データ レコードには unixtimestamp フィールドが含まれます)。 2 つのそのようなテーブルの小さな例ですか?.
  2. その場で 10 週間の制約を変更できるようにしたい。
  3. 現在のパーティションがいっぱいになるか、新しいパーティションが作成されるたびに、以前 (10 週間前) のパーティションが自動的に削除されるようにします。
  4. 自動インクリメント ID の整数をオーバーフローさせたくないのですが、ID がパーティションでのみ一意であることを理解している限り、間違っていなければ、自動インクリメント ID は次のパーティションでゼロから始まりますか? しかし、前のパーティションがまだ存在する場合、2 つの重複した ID があるのでしょうか。結果レコードを提示するときに、最後の ID のみを参照する方法を知るにはどうすればよいでしょうか?
  5. 複数の挿入の代わりに LOAD DATA INTO... を使用して生データをロードしたいのですが、MySQL のパーティショニング機能は影響を受けますか?

最後の質問ですが、エージング メカニズムを実装するための他のアプローチを提案していただけますか (私は、1 日あたり約 1 GB または生データを処理し、結果を MySQL に保存する Java 実装製品を作成しています)。

4

3 に答える 3

1

LOAD DATA は非常に高速です。LOAD DATA と 'delete .. where date < 10 week' の 2 つの手順を実行するだけです (順不同)。自動インクリメントは、使用しているデータ型が続く限り続きます。細心の注意を払いたい場合は、定期的にゼロに戻すことができます。

データが「生」テーブルにある場合は、ルーチンを実行して「処理済み」テーブルを作成します。私が働いている場所でも、同様のプロセスを使用しています。すべての「生」テーブルへの「書き込み」および「解析」ポインターを持つ別のテーブルを保持します。新しいデータが入って解析されると、適切な行ポインターが設定されます。「生」テーブルが切り捨てられた場合、「書き込み」ポインターをリセットできますが、「解析」ポインターはそのままにしておきます。(これが発生した場合、オフセットを別のテーブルに保存します-念のため)。

于 2012-09-25T18:10:12.200 に答える
1

データに依存するため、この質問に本当の答えを出すのは困難です。しかし、いくつか考えさせてください。

  1. 最近のデータを含むある種のログについて話していると思います(したがって、複数年にわたるものではありません)。範囲で分割できます。年/週番号 (つまり、201201、201202 など) を持つ 1 つのフィールドをテーブルに追加できます。この質問が複数のテーブルへのインポートに関する質問に関連している場合は、そのインポート スクリプトで簡単に実行できます。

  2. その場で、その場でデータを再分割します (70GB?)。私はそれをお勧めしません。しかし、そこに週番号があれば、それを行うことができます。後で 12 日に変更したい場合は、日付の列を追加して、それで分割できます。

  3. 自動的に削除されることはありませんが、cron ジョブはそれを処理できますか? パーティションの数を確認し、3 つ (?) ある場合は最初のパーティションを削除します。

  4. パーティションには、パーティション化するフィールドにプライマリ インデックスが必要です (自動インクリメントを使用する場合)。したがって、自動インクリメント ID だけに完全に依存することはできません。これを回避する方法がわかりません。

  5. 私はあなたが何を意味するのか分かりません。

データが時系列のログの一部にすぎない場合は、期間ごとに個別のテーブルを使用できます。次に、新しい期間 (00:00) を開始する前に、最後のテーブルの最後の ID を確認し、新しいテーブルを作成して、自動インクリメントをその値 +1 に設定します。次に、インポートによって新しい期間がいつ開始されるかが決定されるため、簡単に変更できます。インポート スクリプトでは、次の期間を格納できる小さなテーブルを使用できます。

于 2012-09-28T20:17:59.050 に答える
0

また、推奨する場合は、関連する列ごとにインデックス列を作成すると、文字列ではなくインデックス番号を比較しただけなので、パフォーマンスを向上させることができます。複数の関連するテーブルから古いデータを削除します。

あなたのテーブルはソートされているのだろうか。

于 2012-09-29T01:34:05.110 に答える