2011-10-17 6 views
0

私は10ミリメートル以上のレコードと2GB以上の3つのテーブルを持つアプリケーションを扱っています。10ミリメートル以上のデータベース用のMySQL構造

データが挿入されるたびに、少なくとも1つのレコードが3つのテーブルのそれぞれに追加されます。 すべてのINSERTの後、最後のINSERTに関連するデータを抽出するためにこれらのすべてのテーブルを照会するスクリプトが起動されます(これを集約スクリプトと呼ぶ)。

各サーバーの負荷を管理できるように、より小さい単位で、異なるサーバー間でDBを分割する最善の方法は何ですか。

注:
1. 1秒あたり10個を超える挿入があるため、集約スクリプトは同じ回数実行されます。
2.集約スクリプトは、集中的な資源である
3.集約スクリプトは、私が何とか分割する方法を発見していない1が最後のインサート
4に関連している見つけるために、すべてのデータ上で実行する必要がありますDBをより小さな単位に変換する
5.分散データベースについてはほとんど分かりませんので、非常に基本的な用語を使用して、可能であればさらに読むためのリンクを提供してください。

答えて

1

データベースの観点からは2つの回答があります。

  1. 小さな単位にデータベースを分割する方法を見つけます。これはデータベースの使用に大きく依存します。これは本当にあなたの最善の策です。なぜなら、データベースに一度に少ないものを見るようにさせる唯一の方法だからです。これはシャーディングと呼ばれる:
    http://en.wikipedia.org/wiki/Shard_(database_architecture

  2. は読み取り専用モードでは、複数の「スレーブ」のデータベースを持っています。これらは基本的にデータベースのコピーです(少し遅れて)。その遅延が許容される読み取り専用クエリの場合は、サイト全体のコード全体でこれらのデータベースにアクセスします。これは、照会しているマスター・データベースの負荷を取り除きます。しかし、特定のクエリでは依然としてリソース集中型です。

プログラミングの観点からは、ほとんどすべての情報(ids以外)が既に用意されています。挿入後にデータベースを再クエリするのではなく、必要なすべての情報を使用する方法を見つけることができます。最初にクエリを実行するIDのみを作成するプロセスがあるかもしれません。テーブルA、B、Cがあるとします。A_ids、B_ids、C_idsの主キーしか持たない他のテーブルがあるとします。ステップ1、IDテーブルから新しいIDを取得します。ステップ2、A、B、Cに挿入し、同時に何をしたいかを実行します。

また、すべてのクエリの一般的な効率性/パフォーマンスを確認する必要があります。照会しているものに索引があることを確認してください。インデックスを使用していることを確認するために実行しているすべてのクエリに対してexplainを実行します。

これは実際に行うべき中級/上級のdbaタイプです。あなたの会社の周りに尋ね、彼らに手を貸して教えてもらう。

関連する問題