我有一个新闻栏目。文章被标记并存储在3个表中:
帖子:
posts_id,title,body
标签:
tags_id,name
posts_tags:
posts_id,tags_id
目前的问题是新闻部分的首页显示前10篇文章的预览。每个预览都显示标签列表。显示标记列表意味着我必须再次查询每个帖子以获取标记列表。
因此,例如,10个预览需要,1个查询(从帖子中获取10个帖子)+10个查询(标签上的每个帖子1个,以及获取标签列表的posts_tags)。加载页面的11个查询似乎最终可能成为瓶颈。
我应该放弃标记预览吗? PIVOT会产生相同数量的查询吗?
答案 0 :(得分:0)
我看到你可以尝试的两个主要解决方案:
让您的代码在一个查询中执行所有操作(使用联接返回每个帖子及相关标签)
在Web服务器和脚本语言之间使用Cache layer,因此如果页面没有更改,则不会再次查询所有查询
答案 1 :(得分: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
使用这种子选择,通常可以获得比正常连接和分组更好的结果。
缓存当然是个好主意......