2

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

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

例如,我有以下区域:

  1. 网站 - 一个用于统计唯一用户的通用区域,因为我最近不再信任 Google Analytics。
  2. 类别 - 自我描述。
  3. Minisite - 自我描述。
  4. 产品图片 - 每当用户看到产品和潜在客户提交表单时。

问题是一个月后,我的统计表挤满了很多行,而我为解析数据而编写的 ASP.NET 页面加载速度真的很慢。

我想也许可以编写一个以某种方式解析数据的服务,但我看不出有任何方法可以做到这一点而不会失去灵活性。

我的问题:

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

感谢任何帮助的人,

伊坦。

4

3 回答 3

3

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

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

一个简单的增强是存储每个用户/会话的计数,而不是存储每个命中并计算它们。这会将您的分析处理要求降低一个因素,以每个会话的命中顺序为准。当然,在插入日志条目时会增加处理成本。

另一种聚合称为在线分析处理,它只聚合数据的某些维度,让用户以浏览模式聚合其他维度。这权衡了性能、存储和灵活性。

于 2009-01-27T13:23:14.883 回答
2

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

您可以从报告数据库中索引鼻涕,和/或对数据进行非规范化,以便在查询中使用更少的连接。定期将数据从交易数据库导出到报告数据库。该法案将连同前面提到的聚合想法一起改善报告响应时间。

于 2009-01-28T06:21:55.763 回答
1

另一个要知道的技巧是分区。在您选择的数据库中查看这是如何完成的 - 但基本上这个想法是您告诉您的数据库将一个表划分为几个子表,每个子表都有一个相同的定义,基于某个值。

在您的情况下,非常有用的是“范围分区” - 根据值所在的范围选择分区。如果您按日期范围进行分区,您可以为每周(或每天或每月 - 取决于您如何使用数据以及数据量)创建单独的子表。

这意味着,如果您在发出查询时指定了日期范围,则甚至不会考虑超出该范围的数据;这可以节省大量时间,甚至比索引更好(索引必须考虑每一行,因此它会随着您的数据而增长;一个分区是每天一个)。

这使得在线查询(当您点击 ASP 页面时发出的查询)和用于预先计算必要统计信息的聚合查询都快得多。

于 2009-01-27T19:43:10.653 回答