2012-05-12 36 views
0

我有一個新聞欄目。文章的標籤,並保存在3個表:MySQL - 瓶頸 - 加入一對多,新聞標籤

帖子:

posts_id,title,body 

標籤:

tags_id,name 

posts_tags:

posts_id,tags_id 

此刻的問題是新聞部分的首頁顯示前10篇文章的預覽。每個預覽都顯示標籤列表。顯示標籤列表意味着我必須再次查詢每個帖子以獲取標籤列表。因此,例如,10個預覽需要1個查詢(從帖子獲得10個帖子)+10個查詢(標籤和posts_tags上的每個帖子獲取標籤列表1個)。 11個查詢加載頁面似乎最終可能會成爲瓶頸。

我應該放棄標記預覽嗎? PIVOT會導致相同數量的查詢嗎?

回答

0

您可以使用「加入」,以保持它的所有在一個查詢。但是:這些查詢可能會非常「昂貴」,特別是如果您要進行某種分組。所以我會建議嘗試子選擇。例如:

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級主要的解決方案,你可以嘗試:

  • 使您的代碼來完成所有在一個查詢(使用連接返回每個職位與相關的標籤)

  • 使用之間的Cache layer Web服務器和腳本語言,因此,如果頁面沒有改變,它doesen't使所有的querys再次