2016-07-26 16 views
1

私は、サイトのユーザが入力したエントリを持つDjangoアプリケーションを作成しています。今はすべてがうまくいくと思っています。予想される訪問者数を取得します(ありそうもありませんが、私は将来を計画しています)。これにより、単一のPostgreSQLデータベースに何億ものエントリが作成されます。非常に大きなデータベースにエントリを格納する

このような多数のエントリを繰り返してその値をチェックするのは良い考えではないため、エントリをまとめてグループ化する方法を検討しています。

エントリをグループ化すると、この多くのエントリを格納するための良いアイデアが得られますか?または、これを最適化できるより良い方法がありますか?

+2

あなたが何を求めているのか分かりません。なぜエントリを繰り返し処理したいのですか?データベースは検索に優れています。それが彼らの目的です。 –

+0

@DanielRoseman確かに同じ操作を何回もやりたいのは悪い考えですか? – techydesigner

+0

*何の操作ですか? –

答えて

1

一度に1つずつ保管してください。あなたが特定の問題の周囲に何か他のものをデザインしてはなりません。

SQLは宣言型言語です。つまり、「Xに一致するすべてのレコードを指定してください」と指定すると、dbサーバーには通知されません。howしたがって、数百万ものレコードがある場合でも、DBサーバーがこれを迅速に実行できるようにするには、さまざまな方法があります。さらに、RDBMSは何年もの経験を経てこの問題に最適化されているため、PostgreSQLのようなシステムに勝ることはありません。

彼らが言うように、早すぎる最適化はすべての悪の根源です。

次に、PostgreSQLがテーブルを通過して結果を得る2つの方法を見ていきましょう。

最初のスキャンは一連のページを繰り返し、各ページで値をスキャンしてレコードを返します。これは非常に小さなテーブルの他のどの方法よりも優れています。大きなテーブルでは遅いです。複雑さはO(n)です.nは任意の数のレコードのテーブルのサイズです。

したがって、2番目のアプローチはインデックススキャンです。ここで、PostgreSQLはレコードを見つけるためにb-treeインデックスで一連のページを走査します。各レコードを見つけるために複雑さはO(log(n))です。

内部的にPostgreSQLは、ローを固定サイズのバッチでページとして格納します。それはすでにあなたのためにこの問題を解決しています。同じことをしようとすると、レコードのバッチ内にレコードのバッチがあります。これは通常、悪いもののレシピです。

+0

偉大な答えの仲間。非常に有益。どうもありがとう! – techydesigner

+1

btw、私はサイズが10TB +の数億の行を含むdbsで動作します。ある種の非正規化されたストレージが役に立つケースがありますが、あなたの段階では実際にあなたを噛んでしまうかもしれないという考えを持っていないでしょうし、未来を非正規化することは通常問題を作り出す方法です –

関連する問題