如何处理分析的大数据集和不同数量的列?

时间:2010-09-01 15:31:43

标签: php mysql analytics

我正在为移动应用程序构建分析系统,并且在决定如何存储和处理大量数据时遇到了一些困难。

每行代表一个“视图”(如网页)并存储一些固定属性,如用户代理和日期。此外,每个视图可能具有不同数量的额外属性,这些属性与执行的操作或内容标识符有关。

我查看了Amazon SimpleDb,它可以很好地处理不同数量的属性,但不支持GROUP BY,并且在COUNTing行时似乎表现不佳。生成包含30个数据点的月度图表需要查询每个数据集的每一天。

MySQL更好地处理COUNT和GROUP修饰符,但是附加属性需要存储在链接表和JOIN中以检索属性与给定值匹配的视图,这不是非常快。 5.1的分区功能可能有助于加快速度。

我从上述系统的大量阅读和分析查询中收集到的是,最终所有数据都需要聚合并存储在表格中,以便快速生成报告。

我是否错过了我研究中显而易见的任何内容,是否有比使用MySQL更好的方法?它不适合作业,但我找不到任何能够同时处理GROUP / COUNT查询和灵活的表结构的任务。

2 个答案:

答案 0 :(得分:1)

这种情况下,您希望存储一次数据并反复阅读。此外,我认为您希望对查询进行预处理,而不是每次都要计算。

我建议您将数据存储在CouchDB中,原因如下:

  • 它的表是无结构的
  • 其查询已预处理
  • 它对map-reduce的支持允许您的查询按
  • 处理分组
  • 它有一个REST服务访问模型,可以从几乎所有处理HTTP请求的内容进行连接

考虑到新的CouchDB是多少,你可能会发现这个建议。但是我建议您阅读它,因为我个人认为运行CouchDB数据库既甜又轻。比MySQL更轻量级

答案 1 :(得分:0)

保持在MySQL中:如果写入量是限制/读取更常见,并且数据相对简单(即:您可以预测可能的字符),您可以尝试在主要使用text / blob列table,使用逗号分隔值或键/值对更新,并在连接表上使用AFTER INSERT / UPDATE触发器。您将实际数据保存在单独的表中,因此搜索MAX的/特定“额外”属性仍然可以相对较快地完成,但是检索一个“视图”的完整数据集将是主表中的单行,您可以使用您正在使用的脚本/应用程序拆分为单独的值,从而减轻数据库本身的压力。

这样做的缺点是连接表中更新/插入成本的大幅增加:每次数据更改都需要查询记录的所有相关数据,第二次插入“普通”表,喜欢

UPDATE join_table
JOIN main_table
ON main_table.id = join_table.main_id
SET main_table.cache  = GROUP_CONCAT(CONCAT(join_table.key,'=',join_table.value) SEPARATOR ';')
WHERE join_table.main_id = 'foo' GROUP BY main_table.id`).

然而,随着分析数据的发展,它通常会有所不同,所以可能不是每个更新都必须触发缓存中的更新,只需每天使用昨天数据填充缓存的cronscript就可以了。