2

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

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

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

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

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

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

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

非常感谢。

4

3 回答 3

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,但这应该非常简单。

于 2011-03-10T18:06:08.687 回答
0

Firsty:不知道您的架构或数据库系统,但这应该相对简单,假设您记录了您的用户最后一次出现的时间(下面示例中的 $DATE_USER_WAS_LAST_SEEN)并且您的每个帖子都可能与它的主题相关联一种 id,你有一个所有 $FAVOURITE 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)

其次:不要太担心使这些值保持最新。人们会将它们用作有新消息的指标,而不是基于它们的生活决策,因此请为每个用户缓存这些请求(在用户自己的记录中或使用某种内存缓存,如 memcache,如果您熟悉这些) ) 并每隔 5 分钟左右使缓存过期,这将大大减少您对数据库的访问

于 2011-03-10T18:01:15.353 回答
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
于 2011-03-10T18:10:14.013 回答