如何处理Web统计模块的大量数据

时间:2009-01-27 13:04:56

标签: asp.net database-design aggregate olap

我正在为我的网站开发一个统计模块,它可以帮助我衡量转化率和其他有趣的数据。

我使用的机制是 - 在统计表中存储数据库条目 - 每次用户进入我的数据库中的特定区域时(我在cookie的帮助下避免重复记录)。

例如,我有以下区域:

  1. 网站 - 用于计算唯一身份用户的常规区域,因为我最近停止信任Google Analytics。
  2. 类别 - 自我描述。
  3. Minisite - 自我描述。
  4. 产品图片 - 每当用户看到产品和潜在客户提交表单时。
  5. 问题是在一个月后,我的统计信息表中包含很多行,而我编写的ASP.NET页面解析数据负载真的慢。

    我想可能会编写一种能以某种方式解析数据的服务,但在没有失去灵活性的情况下,我无法看到任何方法。

    我的问题:

    1. 大规模数据解析应用程序(如Google Analytics)如何快速加载数据?
    2. 对我来说,最好的方法是什么?
    3. 也许我的数据库设计错了,我应该只将数据存储在一个表中?
    4. 感谢任何有帮助的人,

      伊藤。

3 个答案:

答案 0 :(得分:3)

您正在寻找的基本方法称为聚合

您对通过数据计算的某些功能感兴趣,而不是在启动显示网站时“在线”计算数据,而是通过夜间批处理或写入日志记录时递增计算离线计算

一个简单的增强功能是存储每个用户/会话的计数,而不是存储每个匹配并计算它们。这会使您的分析处理要求降低每个会话点击次数的因数。当然,插入日志条目会增加处理成本。

另一种聚合称为online analytical processing,它只聚合数据的某些维度,并允许用户在浏览模式下聚合其他维度。这会影响性能,存储和灵活性。

答案 1 :(得分:2)

使用两个数据库似乎可以做得很好。一个用于事务数据,它处理所有INSERT语句。另一个用于报告和处理所有查询请求。

您可以将snot索引到报告数据库之外,和/或对数据进行非规范化,以便在查询中使用更少的连接。定期将数据从事务数据库导出到报告数据库。此行为将改善报告响应时间以及前面提到的聚合思想。

答案 2 :(得分:1)

要知道的另一个技巧是分区。查找如何在你选择的数据库的完成 - 但基本的想法是,你告诉你的数据库来划分成几个子表的表,每个都有一个相同的定义,基于一定的价值。

在您的情况下,非常有用的是“范围分区” - 根据值所属的范围选择分区。如果您按日期范围分区,可以为每个星期独立的子表(或每一天,或者每月 - 取决于你如何使用您的数据和量有多大存在)。

这意味着如果您在发出查询时指定日期范围,则甚至不会考虑超出该范围的数据;这可能导致非常显著节省时间,比指数甚至更好(索引必须考虑每一行,所以它会与您的数据增长,一个分区是每天一次)

这使得无论在网上查询(当你打你的ASP页面发出的),并使用预先计算必要的统计数据汇总查询,速度更快。