2009-01-27 27 views
2

我正在为我的网站开发一个统计模块,该模块将帮助我衡量转化率和其他有趣的数据。如何处理网站统计信息模块的大量数据

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

例如,我有以下区域:

  1. 网站 - 作为我停止信任谷歌分析最近数唯一用户的通用区域。
  2. 类别 - 自我描述。
  3. Minisite - 自我描述。
  4. 产品图片 - 每当用户看到产品和提交表单时。

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

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

我的问题:

  1. 如何大规模数据分析的应用 - 如谷歌Analytics(分析)加载数据如此之快?
  2. 我做这件事的最好方法是什么?
  3. 也许我的数据库设计是错误的,我应该只在一个表中存储数据?

感谢任何人帮助,

伊藤。

+0

“解析”是什么意思?请提供数据模型(表格或图片的DDL或摘要或其他内容)。这可能是一个标准的数据仓库问题,顺便说一句。但是,从描述中很难看出。 – 2009-01-27 13:07:07

回答

3

您正在寻找的基本方法称为汇总

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

一个简单的增强将是存储每个用户/会话的计数,而不是存储每个命中并对它们进行计数。这将按照每次会话的点击顺序将分析处理要求降低一个因子。当然,插入日志条目会增加处理成本。

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

1

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

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

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

这使得在线查询(当您打到您的ASP页面时发出的查询)以及用于预先计算必要统计数据的聚合查询速度要快得多。

2

看来你可以通过使用两个数据库做得很好。一个用于事务数据,它处理所有的INSERT语句。另一个用于报告并处理所有查询请求。

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