0

この種のDBモデルを最適化する最良の方法があるかどうかを知る必要があります。

これが私のテーブルです:

[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のコメントをサポートしたいとしましょう...これを最適化する方法はありますか(インデックスを使用する以外に)?ストアドプロシージャ、一時テーブルを使用したクエリを使用して、「事前計算された」フィールドをどこかに追加しますか...?

どうもありがとう!:)

4

1 に答える 1

0

<today - time range>データベースに接続する前に、クライアント側の部分を計算します。

それを超えて、それはあなたが持っているインデックス、あなたのサーバーが持っている負荷(それがメモリにキャッシュし続けるもの)、そして各テーブルのデータの量(典型的な投稿ごとのコメントの数、カテゴリごとの投稿の数など)に依存します)。つまり、プロファイルを作成する必要があります。それがすべて議論の余地があると仮定すると(そうではありません!)、まともなクエリオプティマイザは他のことをほとんど処理できるはずです。

私が習慣から違ったやり方でやることがいくつかありますが、この場合、あなたのシステムをもっと知らなければ、それらは問題にならないはずです。主なものは、ボリュームについて考えることです。

一般に、結合が順番に行われた場合、結果セットが可能な限り小さく保たれるようにクエリを表現するのが好きです。この場合、それはおそらく、結合をpostCategory結合の上にリストし、「 」条件を上にcomments移動して結合式の一部にすることを意味します。= <MyCategoryID>

于 2009-06-11T02:49:34.440 に答える