我正在为我的网站开发一个统计模块,它可以帮助我衡量转化率和其他有趣的数据。
我使用的机制是 - 在统计表中存储数据库条目 - 每次用户进入我的数据库中的特定区域时(我在cookie的帮助下避免重复记录)。
例如,我有以下区域:
问题是在一个月后,我的统计信息表中包含很多行,而我编写的ASP.NET页面解析数据负载真的慢。
我想可能会编写一种能以某种方式解析数据的服务,但在没有失去灵活性的情况下,我无法看到任何方法。
我的问题:
感谢任何有帮助的人,
伊藤。
答案 0 :(得分:3)
您正在寻找的基本方法称为聚合。
您对通过数据计算的某些功能感兴趣,而不是在启动显示网站时“在线”计算数据,而是通过夜间批处理或写入日志记录时递增计算离线计算
一个简单的增强功能是存储每个用户/会话的计数,而不是存储每个匹配并计算它们。这会使您的分析处理要求降低每个会话点击次数的因数。当然,插入日志条目会增加处理成本。
另一种聚合称为online analytical processing,它只聚合数据的某些维度,并允许用户在浏览模式下聚合其他维度。这会影响性能,存储和灵活性。
答案 1 :(得分:2)
使用两个数据库似乎可以做得很好。一个用于事务数据,它处理所有INSERT语句。另一个用于报告和处理所有查询请求。
您可以将snot索引到报告数据库之外,和/或对数据进行非规范化,以便在查询中使用更少的连接。定期将数据从事务数据库导出到报告数据库。此行为将改善报告响应时间以及前面提到的聚合思想。
答案 2 :(得分:1)
要知道的另一个技巧是分区。查找如何在你选择的数据库的完成 - 但基本的想法是,你告诉你的数据库来划分成几个子表的表,每个都有一个相同的定义,基于一定的价值。
在您的情况下,非常有用的是“范围分区” - 根据值所属的范围选择分区。如果您按日期范围分区,可以为每个星期独立的子表(或每一天,或者每月 - 取决于你如何使用您的数据和量有多大存在)。
这意味着如果您在发出查询时指定日期范围,则甚至不会考虑超出该范围的数据;这可能导致非常显著节省时间,比指数甚至更好(索引必须考虑每一行,所以它会与您的数据增长,一个分区是每天一次)
。这使得无论在网上查询(当你打你的ASP页面发出的),并使用预先计算必要的统计数据汇总查询,速度更快。