2009-06-11 42 views
0

一般的なSQLモデル最適化問題(MySQLの)

は、ここに私のテーブルです:

[category] 
idCategory 
name 

[postCategory] (a post can be in more than 1 category) 
idCategory 
idPost 

[post] 
idPost 
post 

[comment] 
idComment 
idPost 
inputDate 
comment 

私がする必要がありますするつもりです特定のカテゴリの特定の時間範囲内のすべての投稿を表示します(時刻は「コメント」からのものです)。時間範囲は固定されています(1日、1週間、1ヶ月、1年)。 (インデックスを使用してほか)、これを最適化する方法はあり...

SELECT DISTINCT(post.idPost), post.post 
from post 
INNER JOIN comment ON post.idPost = comment.idPost 
INNER JOIN postCategory ON postCategory.idPost = post.idPost 
WHERE postCategory.idCategory = <myCategoryId> 
    AND comment.inputDate >= <today - time range> 

レッツ

は、私は10K投稿や500kのコメントをサポートしたいと言う: は、ここで私がして来た何ですか?ストアドプロシージャ、テンポラリテーブルを持つクエリを使用し、 "precalculated"フィールドをどこかに追加しますか?

ありがとうございます! :)

+0

FWIWでは、DISTINCT(post.idPost)を使用すると、DISTINCTが1つの列にのみ適用されるという誤解があります。これは間違っています。これは、かっこを使用するかどうかにかかわらず、常に選択リストによって返されるタプル全体に適用されます。これはあなたの質問に関連していない、それはちょうど参考です。 –

答えて

0

あなたの<today - time range>部分のクライアント側を計算してから、データベースに接続することもできます。

これ以外にも、あなたが持っているインデックス、サーバの負荷(メモリにキャッシュされているもの)、各テーブルのデータ量(通常の投稿あたりのコメント数、投稿数カテゴリごとなど)。つまり、のプロファイルが必要です。すべてのことが疑わしいと仮定すると(これはそうではありません!)、まともなクエリオプティマイザは、他に何かを世話することができるはずです。

私は習慣から違ったやり方をすることがありますが、あなたのシステムをもっと知らなくても、この場合重要ではありません。主なものは、私はボリュームについて考えると思います。

一般に、ジョインが順番に実行されると、結果セットは可能な限り長く保持されるようにクエリを表現したいと思います。この場合、postCategoryの参加をcommentsの結合の上にリストし、「= <MyCategoryID>」の条件を結合式の一部として移動することを意味します。

+0

Mmm ok ..自動スクリプトなどでダミーデータを挿入してモデルを試してみるのはいいですか?とにかく、実際のデータとは異なる結果を得ることができますか? – mrmuggles

+0

ダミーデータは、特に実際のデータを多少表していることが合理的に確信できる場合は、データなしより優れています。 –

+0

私はそのような方法で試してみると、問題がある場合には助けを求めます。ありがとう! – mrmuggles

関連する問題