2

質問はそれをすべて言います。

例: データベース テーブルを分割する予定です。テーブルには、「アクティブ」、「完了」、および「削除済み」としてフラグが立てられた顧客注文が含まれています。また、フラグごとに 1 つずつ、合計 3 つのシャードがあります。

私が理解している限り、フラグが変更されたときに、行を正しいシャードに移動する必要があります。

私は正しいですか?これを行う最善の方法は何ですか?トリガーは使用できますか?

行をすぐに移動するのではなく、日/週/月の終わりにのみ移動することを考えましたが、特定のフラグを持つ行がどのシャードに存在し、すべてのシャードに対して常に検索を実行する必要があるかはわかりません。

編集:いくつかの明確化:

一般に、行が存在するシャードを決定する基準を選択する必要があります。この場合、上記のフラグにしたいと思います。これは、この種のデータを分割する最も自然な方法だからです。(私の意見では)非常に頻繁にアクセスされるアクティブな注文の数は限られています。めったにアクセスされない多数の完成した注文があり、ほとんどアクセスされない膨大な数のデータ行があります。

特定のデータ行が存在する場所を探したい場合、すべてのシャードを検索する必要はありません。ユーザーがアクティブな注文をロードしたい場合、どのデータベースを参照する必要があるかは既にわかっています。

現在、私のシャーディング基準であるフラグが変更されており、このケースに対処する最善の方法を知りたいと思っています。レコードを元のデータベースにそのまま保持すると、最終的にすべてのデータが 1 つのテーブルに蓄積されます。

4

2 に答える 2

2

私の意見では、すべてのアクティブなレコードを単一のシャードに保持することは良い考えではないかもしれません. このようなシャーディング戦略では、すべての IO が単一のデータベース インスタンスで実行され、他のすべてのインスタンスは十分に活用されません。

別のシャーディング戦略は、ある種のハッシュ関数を使用して、新しく作成された行をシャード間で分散することです。これにより、

  • 行のクイックルックアップ
  • すべてのシャード インスタンスに IO を分散します。
  • あるシャードから別のシャードにデータを移動する必要はありません (シャードの数を増やしたい場合を除く)。
于 2010-12-27T07:03:56.607 に答える
1

シャーディングは通常、異なるサーバー上の異なるデータベースにそれらを分離することを指します。Oracle は、パーティション化されたテーブルと呼ばれる機能を使用して、必要なことを行うことができます。

トリガー (after/before_update/insert) を使用している場合、それは即時の移動になります。他の方法では、クリーンアップされるまで、最初のシャード (アクティブ) にさまざまな種類のデータが含まれることになります。

また、日付ごとにこれを行うことをお勧めします (非アクティブで 1 か月以上経過したものを別の「アーカイブ」データベースに移動する毎月のジョブのように)。

パフォーマンスを向上させるためにこれを行っている場合は、これを行うことを再検討するようお願いしたいと思います (このテーブルにテラバイトのデータがある場合を除きます)。シャードを使用する理由を教えてください。問題を解決する方法を全員で考えます。

于 2008-11-20T15:25:21.480 に答える