我正在为移动应用程序构建分析系统,并且在决定如何存储和处理大量数据时遇到了一些困难.
每行代表一个“视图”(如网页)并存储一些固定属性,如用户代理和日期.另外,每个视图可以具有不同数量的额外属性,这些属性与所执行的动作或内容标识符有关.
我查看了 ,它可以很好地处理不同数量的属性,但是不支持GROUP BY,并且在行时似乎表现不佳.生成包含30个数据点的月度图表将需要查询每个数据集的每一天.
MySQL更好地处理COUNT和GROUP修饰符,但是附加属性需要存储在链接表和JOIN中以检索属性与给定值匹配的视图,这不是非常快. 5.1的分区功能可能有助于加快速度.
我从上述系统的大量阅读和分析查询中收集到的是,最终所有数据都需要聚合并存储在表中,以便快速生成报告.
我是否错过了我研究中显而易见的任何内容,是否有比使用MysqL更好的方法?它不适合作业,但我找不到任何能够同时进行GROUP / COUNT查询和灵活的表结构的任务.
解决方法:
保持在MysqL中:如果写入量有限/读取更常见,并且数据相对简单(即:您可以预测可能的字符),您可以尝试在主表中使用text / blob列,使用逗号分隔值或键/值对更新,并在连接表上使用AFTER / 触发器.您将实际数据保存在单独的表中,因此搜索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`).
但是,随着分析数据的发展,它通常会有所不同,所以可能不是每个更新都必须触发缓存中的更新,只需每天使用昨天数据填充缓存的就可以了.