2011-07-21 12 views
1

これは、大量のDB設計に関する設計上の質問に過ぎません。たとえば、1,000万人のユーザーを収容するデータベースを構築しようとしていた場合、どのように構築するのですか?どのように大規模な設計データベースを設計しますか?

私の主な興味はデータベース複製のようなものですが、これは実際にスピードアップしますか?

このサイズのデータ​​ベースを構築するときは、フィールドを「username」「name」「company」「dob」「gender」とします。インデックス?

+0

1000万行と5列は小規模なデータベースであり、大規模なものではありません。 – sqlvogel

答えて

3

10ミリオンは特に巨大ではありませんが、あなたのオプションを慎重に検討する必要があるほど十分です。

多くの場合、複製が役立ちます。あなたが書いている以上にあなたのユーザーテーブルを読んでいると仮定すると、書き込みのみを扱うマスターデータベースを考えるかもしれません。あなたのアプリケーションは、N個のスレーブボックスのいずれかから読み込まれます。

もちろん、索引は非常に重要です。頻繁に検索される列(WHERE節、または他の表との関係の結果(JOINS))のいずれかに索引を付ける必要があります。アプリケーションが作成するクエリの種類を分析する方法と、その分析に基づいてインデックスをスマートに定義する方法については、多くのことが書かれています。あなたがそのことについて学んでいるだけなら、いくつかの読書をして、より集中的な質問でSOに戻ってください。

シングルマスターレプリケーション(および注意深いインデックス作成)を超えて、実際に大きくなるにつれて、partitioningについて考え始めるかもしれませんが、それは私が今までに読んだことのあるものなので、私は言いたくありませんそれについてあまりにも多くの。

0

1000万のレコードは必ずしも大きなデータベースではありません。一部の人は、数億行以上のテラバイトまたはペタバイトのストレージで構成された大規模なデータベースを検討する人もいます。

標準的な正規化以外に、テーブルの深さ(行数)を減らすことができない場合、インデックスは確かに役立つでしょう。

0

これはいつもユースケースに依存します。データベースで実行するクエリは何ですか?

一部のアプリケーションでは、ユーザ名またはuidでユーザを検索します。キー値ストアは完全で無限にスケーラブルです。

あなたは、あなたが(適切な列にインデックスを持つ)SQLにデータを入れたり、外部の検索全文検索エンジン(Luceneの、スフィンクス)を使用することができ、追加の検索クエリを持っている場合。異なるレプリカ上に異なるインデックスを構築することもできます。そのため、それぞれのクエリーに使用できますが、インサートのパフォーマンスは良好です(もちろん、ユーザーテーブルではなく、ユーザー関連のデータ)。

複雑なクエリがある場合、複数のテーブルを結合するとSQLが唯一の選択肢ですが、シャーディングをユーザー名とユーザー関連のデータに合わせることができます。クエリは何ですか?オフラインクエリ(統計、レポート)では、各シャード上で結合を行い、結果セットをマージすることができます(map-reduce、gearmanフレームワークがここで役立ちます)。

最後に、これらのアプローチをすべて組み合わせて、ログインにkey-valueを使用し、複雑なクエリにSQLを使用し、耐久性とパフォーマンスの両方にレプリケーションを使用できます。

関連する問題