正确完成用户活动的数据库结构?

时间:2011-02-02 22:18:38

标签: sql mysql database-design data-structures relational-database

用户活动日志的正确方法是什么,比如Facebook如何做到这一点并且真的很快。我有一个客户的网站,它有活动记录用户的活动并显示给他/她的朋友/家人/粉丝,但它很慢,我们愿意在数据库中进行更改,如果它有助于改善用户交互性并做正确的日志。我肯定很多人已经研究过它,但我找不到它的任何链接,这表明它是如何正确完成的,所以我也可以实现它。有什么帮助吗?

期望的活动输出

enter image description here

1 个答案:

答案 0 :(得分:1)

嗯,Facebook的架构具有很高的可扩展性,它们对数据请求有很多“前门”,并且有一些真正的力量可以有效地处理数据。

第一个问题是,这个应用程序应该处理多少并发用户? &lt; 100,只需确保您的数据层索引良好,并且您正在进行“智能”查询(使用索引标准准确获取显示页面所需的数据,不多也不少)。如果要为查询返回大量数据,请在查询中对其进行chunkify(SELECT TOP 25 ... FROM Activity WHERE Activity.Date < <date of the last record of the last page you retrieved>)低数百,考虑复制服务器以分离非实时或不常使用的任务,或者仅仅进行负载平衡。数百人,开始考虑具有分布式表和批量交易传送的服务器集群。更重要的是,你超越了我在企业架构方面的专业知识。

任何情况下你的第一步:

  • 配置您的数据库。查看用户可以采取的每个操作生成的查询,并严格查看该查询是否是执行此任务的最有效方法。重构基于游标的操作;你不希望在任何预期会快速执行的操作中使用它们,因为它们会使SQL引擎在处理数字时给你带来许多麻烦。
  • 确定最常用于过滤/检索结果的标准,尤其是使用相等的标准,并生成这些群集主键。群集密钥将使服务器在相同的数据页上排列具有相同标准的数据,以便更快地检索可能在块中检索的数据。但要小心;太多的指数会降低表现。
  • 如果查询看起来很好,并且它是针对索引良好的模式执行的,但它仍然很慢,请考虑将查询重构为表值函数或存储过程。这些是预编译的,并且是一个预先设计的查询计划,可以节省您在公共数据库调用上的开销。它们还需要通过网络发送更少的信息。
  • 在网络服务器端的会话存储或其他内存存储库中缓存一些更昂贵的查询的结果,特别是由几个页面共享的数据和/或不太可能快速更改的数据。您的网络服务器需要大量内存。
  • 还不够吗?在数据库服务器计算机中投入更多硬件资源。
  • 考虑分布式模型;大多数主要DBMS都可以在集群环境中工作。如何构建该模型取决于您的模式和执行的操作;最常见的是,按地理区域划分数据效果很好,即使像Facebook这样的巨头也是如此。
  • 当你正在做这一切时,你可以通过结合像AJAX这样的异步技术来提高UI的响应速度。当数据库服务器仍在搅拌时,页面的框架可以在浏览器中加载和显示,然后数据可以异步跟随并以延迟的方式呈现在页面中。