2012-11-30 12 views
5

私はこのような構造を持つ、PostgreSQLデータベースとのRuby on Railsのアプリを持っています。各Aには数千のBがあり、各Bには数千Cの数があります(各Aには数百万のCがあります)。水平データベースのスケーリング

Aは独立しており、異なるAからのBとCは一緒に(つまり同じクエリ内で)必要とされません。

私の問題は、ActiveRecordのクエリがかなり長くかかるということです。 Cのテーブルに何千万もの行がある場合、クエリには永遠にかかるでしょう。

私は、データベースを水平に拡大することを考えています(つまり、Aのテーブル、Bのテーブル、それぞれのAのCのテーブル)。しかし、私はそれを行う方法を知らない。それは私が推測するようなシャーディングのようなものですが、動的にDBテーブルを作成する方法を理解することはできず、ActiveRecordを使ってデータにアクセスします。

ありがとうございました。

+1

チェック

http://www.mongodb.org/

'公的なもの '。 – tadman

+0

ありがとう、私はスキーマについて知らなかった。しかし、どうすればそれを動的に行うことができますか? – Nicolas

+0

私があなただったら、私は何かのアドオンやプラグインを探すことができます。私はPostgres空間に慣れ親しんでいませんが、飛び降りる点として役立つ[Octopus](https://github.com/tchandy/octopus)のようなものがあります。 – tadman

答えて

2

わずか数行、または数百万行のパフォーマンス懸念がある場合は、ソリューションを環境エンジニアリングする前に一歩前に戻る必要があります。記述している問題は、索引付けによって非常に簡単に解決できます。追加の物理テーブルを作成する利点はありませんし、あなたは信じられないほどの複雑さを導入するでしょう。

@ mu-is-too-shortは既に述べています。クエリプランに注意してください。ツールを使用してパフォーマンスを分析します。

table partitioningは物理的にも透過的にもさまざまな断片化されたテーブルにデータの格納を格納できると言われていますが、非常に高速になりますが特定の時間ボックス(月など)でのみ有用なデータに特に便利です。アーカイブビットフラグ列でこれを実行して、より古いストレージ(SSDのRAIDなど)にアクティブなレコードを保存しながら、古いレコードまたは削除されたレコードをいくつかのより低速のストレージ(たとえば、錆びた標準RAID)にシャトルすることもできます。

+0

ありがとうございます。インデックスを作成して問題が解決されたとしたら、どういう意味ですか?現在、CのインデックスにはBのインデックスがあり、AのインデックスはBのインデックスになります。 – Nicolas

+0

テーブルにインデックスがある場合でも、数百万行も比較的早く返されるはずです。古いハードウェアを使用していない限り、かなり長くはなりません。実験では、Navicatのようなツールを使ってActiveRecordによって実行されると思うSQL文を実行します.OctiveRecordはその考え方ではないことがよくありますが、ARのパフォーマンスとどのように比較しているかを見てください。あなたのlog/development.logをテールし、あなたがN + 1のクエリのパフォーマンスに陥るのを(誤って結合を除外して)見てください。どのような種類のインプロセス要件が何百万行もの操作を必要としているのを知りたいのですが、 MM +の行操作は通常procから外れています。 – cfeduke

0

だから、あなたは木のような構造をしているようです。相互参照のような方法でデータベースからそれらを取り出す必要が本当にない場合、あなたのAはまさに "ドキュメント"のプロパティを持っています.MongoDBを見てください。 AはBのすべてと一緒に保存され、Cのレコードは1つのレコードに保存されます。あなたはORMを探しているなら、あなたはこれを行う場合、あなたはあなたがkajillionテーブルを作成しないように、異なるスキーマに分配することをお勧めします

http://mongoid.org/en/mongoid/index.html

+0

ありがとう!私はNoSQLについて考えていなかったかもしれませんが、おそらくそれは私が探しているものです – Nicolas

+1

Mongoを使用している場合、書き込み性能に関する懸念がありますが、2.2以降はグローバルロックがなくなっています(2.0以降は使用していません)おそらくそれは以前と同じくらい悪くないでしょう。また、冗長性も考慮する必要があります.10genでは、スケーリングされた冗長環境のために最小限の6台のVM(物理ホストが異なる)を推奨しています。基礎となるデータストレージを変更する前に、データを非正規化することを躊躇しないでください。さらに、PostgreSQLにはNoSQLの代替であるHstoreがありますが、それはそれが適用可能かどうかを調べるためにはさらに多くの研究が必要です。 – cfeduke

関連する問題