处理和存储分析数据的最佳方法

时间:2011-01-20 18:33:03

标签: mysql logging analytics

我正在设法为电子邮件广告系列生成基于时间轴的图表。由于每个广告系列可以包含数十万条消息,最终会有数百或数千个广告系列,我无法提供实时图表,我需要以某种方式预处理日志,以便在合理的时间范围内生成图表(几秒钟)。

以下是我当前想法的简化版本,该版本运行良好,但有一个显示停止缺陷:

CREATE TABLE message_log (
    log_id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
    log_campaign_id INT UNSIGNED NOT NULL,
    log_message_id INT UNSIGNED NOT NULL,
    log_action VARCHAR(10) NOT NULL,
    log_timestamp INT UNSIGNED NOT NULL,
    log_counted TINYINT UNSIGNED NOT NULL DEFAULT 0,
    INDEX(log_counted)
);

CREATE TABLE message_stats (
    stats_campaign_id INT UNSIGNED NOT NULL,
    stats_year INT UNSIGNED NOT NULL,
    stats_month TINYINT UNSIGNED NOT NULL,
    stats_day TINYINT UNSIGNED NOT NULL,
    stats_hour TINYINT UNSIGNED NOT NULL,
    stats_sent_count INT UNSIGNED NOT NULL,
    stats_open_count INT UNSIGNED NOT NULL,
    stats_bounce_count INT UNSIGNED NOT NULL,
    PRIMARY KEY (stats_campaign_id, stats_year, stats_month, stats_day, stats_hour)
);

因此,我们的想法是在message_log表中实时记录各种log_action(已发送,打开,退回)。 message_stats表保存已处理的数据,这只是1小时间隔内发送,打开和退回邮件的计数。 message_log.log_counted标志指示该行是否已被处理为message_stats。

当我需要最新的统计数据时,我只需从message_log中选择log_counted = 0的行,在message_stats中计算它们,并设置log_counted = 1。我现在可以通过对各个列进行分组,快速轻松地选择特定于广告系列或一般的年度,每月,每日或每小时统计数据。

完全跳过message_log并简单地实时更新message_stats表可能更简单,但我选择保留原始日志数据,以便以后可以轻松地重新生成数据,只需截断message_stats和设置即可message_log.log_counted = 0。

到目前为止测试中这种方法运行良好,但缺点是图形必须是特定于区域设置的,并且由于时间线已经基于系统时区进行处理,因此无法使用此系统生成时区特定图形。 / p>

关于更好方法的任何想法?我知道我不是第一个面临这种困境的人。

2 个答案:

答案 0 :(得分:1)

创建message_stats_locale_agnostic,然后修改message_stats以包含区域设置列。

您现在有三个步骤:message_log => message_stats => message_stats_locale_agnostic。

message_stats仍然包含聚合数据,但它现在也按区域设置进行切片,因此您将在此表中获得比以前更多的行。

现在还需要一个聚合过程,它通过忽略message_stats中现在存在的语言环境列来填充message_stats_locale_agnostic表。这个表基本上就是你在message_stats中所拥有的。

如果您需要基于区域设置的数据,请从message_stats中进行选择(知道它会比您从message_stats_locale_agnostic中选择时慢一点。)如果您需要的数据不是基于区域设置,请从message_stats_locale_agnostic中选择。

答案 1 :(得分:1)

一种选择是不要自己解决这个问题。有很多分析服务或工具可以帮助解决繁重的问题(完全披露:我开始了其中之一)。我已将此答案作为社区维基,以便其他人可以添加自己的收藏夹。但是这里列出了我对他们的看法的潜在解决方案:

  1. Keen IO(我的公司)。通过API自定义分析。当您考虑构建自定义分析解决方案但不想从头开始实际构建所有内容时非常有用。可用于直接在您的网站或应用中构建分析功能。很多开发人员都在这里利用!但没有内置仪表板。你必须建立自己的。

  2. MixPanel。可自定义的分析仪表板。如果您想要一个登录和查看数据的地方,那就太好了。非常适合在UI中点击。也适用于跟踪和参与用户交互。大量订购可能会变得非常昂贵。

  3. Vertica的。您部署到自己的硬件上的Analytics DB。高度可扩展,高度架构。许多旧学校分析解决方案(Zynga等)都建立在此基础之上。

  4. Hadoop的作为一种服务。有很多公司提供此服务。他们管理构建和维护Hadoop集群的复杂性。您仍然需要执行诸如编写map-reduce作业之类的操作。如果你需要Hadoop,可能会节省大量时间。

  5. 请添加更多!