MySQL - 瓶颈 - 加入一对多,新闻文章的标签

时间:2012-05-12 14:43:41

标签: mysql join

我有一个新闻栏目。文章被标记并存储在3个表中:

帖子:

posts_id,title,body

标签:

tags_id,name

posts_tags:

posts_id,tags_id

目前的问题是新闻部分的首页显示前10篇文章的预览。每个预览都显示标签列表。显示标记列表意味着我必须再次查询每个帖子以获取标记列表。

因此,例如,10个预览需要,1个查询(从帖子中获取10个帖子)+10个查询(标签上的每个帖子1个,以及获取标签列表的posts_tags)。加载页面的11个查询似乎最终可能成为瓶颈。

我应该放弃标记预览吗? PIVOT会产生相同数量的查询吗?

2 个答案:

答案 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

使用这种子选择,通常可以获得比正常连接和分组更好的结果。

缓存当然是个好主意......