2012-05-12 15 views
0

私はニュースセクションを持っています。記事にはタグ付けと3つのテーブルに格納されます。MySQL - ボトルネック - 1対多に参加、ニュース記事のタグ

記事:

posts_id,title,body 

タグ:

tags_id,name 

posts_tags:

posts_id,tags_id 

現時点での問題は、ニュースセクションの先頭ページに最初の10個の記事のプレビューが表示されることです。各プレビューでタグリストが表示されます。タグリストを表示するということは、タグのリストを取得するために、それぞれの投稿について再度照会する必要があるということです。

たとえば、10個のプレビューでは、1つのクエリ(投稿から10個の投稿を取得)+ 10個のクエリ(タグリストを取得するタグとposts_tagsごとに1個)が必要です。最終的にボトルネックになる可能性があるように、ページを読み込むための11のクエリがあるようです。

タグ付けプレビューは不要ですか? PIVOTは同じ量のクエリを生成しますか?

答えて

0

「結合」を使用すると、クエリ。しかし、これらの種類のクエリは、非常に「高価」になることがあります。何らかのグループ化を行う場合は、特に注意してください。だから私はsubselectsで実験することをお勧めします。例:

SELECT (
    SELECT GROUP_CONCAT(name) 
    FROM tags, posts_tags 
    WHERE posts_tags.posts_id = posts.posts_id 
    AND tags.tags_id = posts_tags.tags_id 
) FROM posts LIMIT 10 

通常、このような種類の副選択では、通常の結合やグループ化よりもはるかに良い結果が得られます。

キャッシングはもちろん、まだ良いアイデアです...

0

私はあなたが試みることができる2つの主要なソリューションを参照してください。

  • はあなたのコードが1つのクエリ(結合を使用して、関連するタグを使用して、各ポストを返す)

  • 使用の間Cache layerですべてを行うことを確認しますWebサーバーとスクリプト言語のため、ページが変更されない場合は、再度クエリーを作成しません。

関連する問題