2011-12-23 7 views
3

現在、私は非常に大きなWebシステムを構築しており、強力なSQLデータベースソリューションが必要です。いくつかのタスクは読取り専用(MyISAMエンジン)でなければならず、その他は大規模書込み(InnoDB)であるため、PostgresでMysqlを選択しました。Mysql OR mysql + sqlite OR mysql + ownソリューション

この読み取り専用機能について質問があります。それは非常に高速でなければなりません。ユーザーは1秒未満で回答を得る必要があります。 レッツは、私たちが10以下数百万行と行の約150百万人に「element」という名前の別の1で「object」という名前の1つのウェルインデックステーブルを持っていると言います。 また、だから我々は、テーブルの上にパーティションをやろうとしている「elementを」テーブルとテーブルからオブジェクトを結ぶ「element_object」の情報を含む「element」という名前のテーブル「object」(行数億)

を持っており、「element_object 8192個のテーブル「element_hash_n{0..8191}a」と24576個のテーブル「element_object_hash_n{0..8191}_m{0..2}」とを有する。

ユーザの質問への回答は、2段階の検索のようになります。テーブルからの要素のidを探す

  1. 「element_hash_n」
  2. 主なSQLは、「オブジェクト」テーブルで選択し、テーブル「element_objectに参加ください見つかった(最初のステップからの)ID

となるフィルタする..hash_n_m」私は最初のステップについての疑問: 何が良いだろう。

  1. mysqlの
  2. で32Kのテーブルの上にストア(すべて)1つのSQLiteデータベースを作成し、そこに最初のステップの目的
  3. のための8192のテーブルを格納8192個の異なるsqliteのファイル(データベース)
  4. を作成し、ファイルシステム内の8192個のファイルを作成して作りますIDを見つけるための独自のバイナリソリューション。

私は私の英語のためすみません。私の母国語ではありません。

+0

なぜ3つのテーブルに比べて何千ものテーブルを持つ方が良いと思いますか? –

+0

テーブルは使用可能なRAMよりはるかに大きいので、パーティション化は3つのテーブルより優れていると思います。もちろん、いくつのテーブルが必要かという疑問があります。 –

+0

なぜデータベースは、一度にメモリ全体でテーブル全体(または、おそらくより関連してインデックス全体)を保持しなければならないと思いますか?それは...限定的なものになるでしょう... –

答えて

2

私はあなたが多くのパーティションに行くと思います。パーティションが32000を超える場合は、管理のオーバーヘッドが大きくなります。 element_hash_ *という名前を指定すると、要素のハッシュを作成し、このように分割するかのように継ぎ目があります。しかし、ハッシュを使用すると、すべてのパーティションでデータを均等に分配できます。これがどのようにパフォーマンスを改善するのか分かりません。すべてのパーティションでデータにアクセスする場合、メモリのサイズにパーティションを持たせることで何も得られません。別のパーティションのすべてのクエリデータをロードする必要があります。

私たちは、クエリの90%以上が基準として現在の日付を使用するトランザクション・システム上のパーティションを使用していました。このような場合、日にちを基準としたパーティションが非常にうまく機能しました。しかし、私たちは8つのパーティションしか持たず、長時間のストレージのために別のデータベースにデータを移動しました。

私のアドバイス:データはその速い必要になるものを見つけると一緒にグループにそれを試してみてください。そしてあなた自身のパフォーマンステストを行う必要があります。速いデータを提供することが非常に重要である場合は、まともなテスト環境を構築するのに十分な管理サポートが必要です。 テスト結果では、リレーショナルデータベースシステムを使用してデータを十分に高速に配信できない場合があります。その場合は、NoSQL(SQLだけでなく)のソリューションを参照する必要があります。

あなたのWebシステムはどのような技術で構築されていますか?この部分もテストする必要があります。非常に高速なデータベースは、パフォーマンスの低いWebアプリケーションで時間を失っても、あまり役に立ちません。

関連する問題