如何优化收藏夹中新帖子的数量

时间:2011-03-10 17:41:35

标签: sql optimization bookmarks favorites

我想说,我会很高兴收到任何答复。我将尝试构建我的文本以便更好地理解。

场合 我运行主题互联网论坛,您可以在菜单中添加主题作为收藏,菜单显示这些主题中的新帖子数量。因此,每次重新加载页面(转到整个网站的任何位置)时,都会检查收藏夹中所有主题的新帖子。

问题 这当然在DB上非常昂贵,因为它通常有20-50个收藏夹,如果在这些主题中添加了任何帖子,我必须检查数据库。平均主题有1000-2000个帖子。这种情况发生在每个用户的每次浏览量上,每月大约有900 000次综合浏览量。

可能的解决方案1 ​​ 我在每个主题中存储总帖子数,并为每个用户存储每个主题的最后查看帖子数。这可能是最快的,但它有很多缺点,它们是功能性的(删除,过滤帖子等)。

可能的解决方案2 我为每个用户存储每个主题的最后查看帖子的ID。这是一个非常好的解决方案,但比前一个慢了十倍。

数据库 我将所有主题的所有帖子存储在一个巨大的表格中=数千个帖子。

问题 我想删除带来解决方案1的问题,但我需要保持速度。我想为每个主题创建一个表并使用解决方案2,但我不知道它是否会有所帮助。所以,如果您有任何经验,请告诉我什么是最快的解决方案。

非常感谢。

3 个答案:

答案 0 :(得分:0)

第一:不知道你的架构或数据库系统,但这应该相对简单,假设你记录上次看到你的用户的时间(下面的例子中为$ DATE_USER_WAS_LAST_SEEN),你的每个帖子都可能与它相关联通过某种id获取主题,并且您有一个所有$ FAVORITE ID的列表。

SELECT topic_id, count(*) AS count FROM posts 
WHERE topic_id IN ($FAVOURITES) 
    AND created_date > $DATE_USER_WAS_LAST_SEEN 
GROUP BY topic_id

将为您提供如下输出:

topic_id   |   count
---------------------
  3        |     20
  1        |     27
  33       |     120

对于这种扩展,这应该是可接受的速度,如果数据库不自动优化这些内容,则可以通过不使用IN并生成长(topic_id = 1 OR topic_id = 2 OR topic_id = etc)字符串来改进查询。 / p>

其次:不要太担心保持这些价值最新。人们将使用它们作为指示新消息,而不是基本生命决定,因此每个用户缓存这些请求(或者在用户自己的记录上或使用某种内存缓存,如memcache,如果你熟悉那些并且每隔5分钟左右使缓存过期,这将从根本上减少您对数据库的命中

答案 1 :(得分:0)

我认为你的帖子ID是连续的并且总是递增。

为您的收藏夹创建一个至少包含以下字段的表:user_id,topic_id,last_post_id

然后,您可以使用以下简单查询检查新帖子:

select topics.id, count(posts.id)
from users
inner join favorites on favorites.user_id = users.id
inner join topics on topics.id = favorites.topic_id
inner join posts on 
    posts.topic_id = topics.id and
    posts.id > last_post_id
where users.id = $id
group by topics.id

这应该非常顺利。

每次用户访问主题时,您还必须更新last_post_id,但这应该非常简单。

答案 2 :(得分:0)

我在巨大的all_posts表上有一个索引(topic_id,post_id),执行此查询的成本不会太高:

select topic_id, count(*)
from all_posts a
inner join user_favorites u on u.topic_id = a.topic_id
where a.post_id > u.post_id and u.user_id = @user_id
group by topic_id