跟踪数据库表的日常使用情况

时间:2012-08-04 13:10:30

标签: mysql database analytics theory

我的数据库中有大约100,000名艺术家/乐队。我希望能够跟踪每个乐队的视图,例如,如果我正在查看Pearl Jam指标,我希望能够在2012年1月1日看到他们看到10,000个观看次数,在1/2/2012他们看到了12,000次观看......等等。

捕获此数据的最佳方法是什么?我不是在寻找代码帮助,而是在寻找理论/建议。

我正在考虑做以下事情:

  1. 为艺术家点击表格。每次查看Pearl Jam(或任何其他艺术家)时,都会插入一个新行来跟踪此视图(包括艺术家ID和时间戳)。
  2. 过去24小时在这些行上运行夜间脚本。按艺术家ID分组和计数。将此计数插入该特定日期的每位艺术家的新表格中。
  3. 截断此命中表,使其不会变得非常庞大。
  4. 选择艺术家ID以获取视图。
  5. 这是正确的思路吗?有什么建议吗?

1 个答案:

答案 0 :(得分:2)

我是开源分析平台Countly的开发人员,希望与您分享我的经验。

为艺术家和地图插入每个视图的新行 - 每天减少这些结果肯定是一个解决方案(它实际上是旧分析解决方案已经使用的解决方案)但是您可以选择更好的方法。但是,这种方法需要使用面向文档的数据库,就像MongoDB一样。

当艺术家有视图时,您将对相关字段进行增量,如:

db.views.update({'artist_id': 1}, {
    '$inc': {
        "views": 1,
        "2012.views": 1,
        "2012.8.views": 1,
        "2012.8.4.views": 1
    }
})

您将在视图集中获取文档,如下所示;

{
    "artist_id": 1,
    "2012": {
        "8": {
            "4": {
                "views": 1 /* today */
            },
            "views": 1 /* august */
        },
        "views": 1 /* 2012 */
    },
    "views": 1 /* all time */
}

此解决方案不需要批处理,实际上是实时的。如果您想查看8月份的所有统计信息,只需获取下面的结果,您就会看到8月份所有日期的数据加上8月份的总观看次数。

db.views.findOne({"artist_id": 1}, {"2012.8": 1})

或者,如果您只需要2012年的总观看次数;

db.views.findOne({"artist_id": 1}, {"2012.views": 1})

假设您正在使用LAMP堆栈,您可以查看MongoDB PHP driver