【问题标题】:How to handle large amounts of data for a web statistics module如何为 Web 统计模块处理大量数据
【发布时间】:2009-01-27 13:04:55
【问题描述】:

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

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

例如,我有以下区域:

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

问题是一个月后,我的统计表包含很多行,而我编写的用于解析数据加载的 ASP.NET 页面真的很慢。

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

我的问题:

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

感谢任何提供帮助的人,

伊坦。

【问题讨论】:

  • “解析”是什么意思?请提供一个数据模型(表格或图片或摘要或其他内容的 DDL。)这可能是一个标准的数据仓库问题,顺便说一句。但是,很难从描述中分辨出来。
  • 也可能有助于了解您所说的“很多”是什么意思。此外,如果您指定数据库,您可能会得到更好的答案。

标签: asp.net database-design aggregate olap


【解决方案1】:

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

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

一个简单的改进是存储每个用户/会话的计数,而不是存储每个点击并计算它们。这将按每个会话的命中顺序减少您的分析处理要求。当然在插入日志条目时会增加处理成本。

另一种聚合称为online analytical processing,它只聚合数据的某些维度,并让用户在浏览模式下聚合其他维度。这需要权衡性能、存储和灵活性。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-24
        • 2018-09-17
        • 2015-04-10
        • 1970-01-01
        • 2017-10-07
        • 2019-11-25
        • 2016-09-28
        相关资源
        最近更新 更多