缓存SQL表中计数的最佳方法是什么?

3
我想从头开始开发一个论坛,并需要特殊需求和定制。
我希望为我的论坛做好密集使用的准备,想知道如何缓存用户发布数量和回复数量等内容。
只有三个表tblForum、tblForumTopics、tblForumReplies,最佳的缓存用户主题和回复计数的方法是什么?
考虑一个简单的场景:用户点击一个链接并打开Replies.aspx?id=x&page=y页面,开始阅读回复。在HTTP请求中,服务器将运行一个SQL命令,该命令将检索该页面的所有回复,并“内部连接tblForumReplies以查找每个回复用户的回复次数”。
select 
    tblForumReplies.*,
    tblFR.TotalReplies
from 
   tblForumReplies
   inner join 
     (
       select IdRepliedBy, count(*) as TotalReplies
       from tblForumReplies
       group by IdRepliedBy
     ) as tblFR 
     on tblFR.IdRepliedBy = tblForumReplies.IdRepliedBy

很不幸,这种方法非常消耗CPU资源,我希望看到您关于如何缓存表计数的想法。

如果在插入/删除时为每个用户计算回复数,并将其存储在单独的字段中,如何与手动更改数据同步。假设我将手动从SQL中删除回复。

4个回答

4
这是我考虑的三种方法:
1)也许SQL Server的性能已经足够好,你不需要缓存。你可能低估了SQL Server的能力。如果你正确使用连接,只需一个查询即可获取该线程中所有用户计数。如果你认为每个用户都需要一个查询,那是错误的。
2)不要缓存。在用户表上冗余存储用户计数。每次插入或删除帖子时更新用户行。
3)如果你有成千上万的用户,甚至不超过百万,你可能会发现将用户及其计数缓存在Web层的内存中是实际可行的-对于ASP.NET来说,是“Application”缓存。

谢谢你的回答。2)不是一种缓存形式吗?我遇到了这个问题,因为我正在维护一个新应用程序中的模式,在该应用程序中,他们将计数存储在数据库中,但在一个单独的卫星表中使用1-1 FK。我发现这有点过度,我正在尝试找到其他关于此模式的参考资料。 - Mathieu J.

2

在确定必须使用缓存之前,我不会费心去缓存。根据我的经验,无法预测哪些地方需要缓存。尝试迭代方法,先尝试实现不带缓存的版本,然后收集统计数据,再实现正确的缓存(有许多种,如内容、数据、聚合、分布式等)。

顺便说一下,我认为你的查询不会占用太多CPU资源。SQL服务器将优化该操作,COUNT(*)将在瞬间运行...


2

tbl前缀很糟糕——就像Replies.aspx?id=x&page=y这样的URI一样。考虑使用ASP.NET MVC或仅使用路由部分。

其次,不要过早优化。但是,如果您确实需要,可以对数据进行非规范化处理:向ForumTopics表中添加TotalReplies列,并依赖于您的DAL / BL来保持此字段最新(可能需要定期任务来重新同步它们),或使用触发器。


1
对于每个回复,您需要保留TotalRepliesTotalDirectReplies。这样,您可以支持回复的树状结构,并在整个层次结构中更新计数,而无需每次进行计数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接