2012-12-04 30 views
3

我需要存储具有多个分段(聚合)可能性的原始(未聚合)数据。例如:一天,一天中的小时,设备等。至少有6个分割列,每列有平均5个唯一值。我需要在各种范围内管理这些数据的所有可能的聚合。具有多个聚合列的100M /月行的方法

在例如:

  • 我需要一天的日子和时辰分组columnX的总和较上月
  • 我需要columnX的总和,columnY的平均分为按月份和设备从去年

它必须是原始数据。这项规定每月将产生平均1亿条记录。我无法存储任何款项,因为我必须为每个分段列组合存储每个可能的总和。

什么数据库引擎/设计是最优化这样的任务呢?最初我们选择MySQL数据库的应用程序,但在选择时,我们并没有完全意识到需要提取的数据结构和统计数据。现在,当我知道它时,我想到了表格分区,但我不熟悉它,并且不确定它是否真的有帮助,因为范围很广。如果它没有帮助,如果MySQL失败了这个任务,无论是表设计,还是做什么?像MongoDB这样的非关系引擎的例子?

查询要求 - 不超过2-3秒。

认为公司硬件资源,数据库处理 - 对夫妇的高品质服务器,但肯定不是数十或数百个。

回答

1

我已经找到了最好的工作是存储没有在任何类型的数据库的原始数据,但存储的您正在寻找在这些系统中查询一下聚集。原因在于原始数据非常笨拙,并且无论您搜索的是什么,尤其是如果您将整个原始数据集放入其中,搜索一天内可能出现的1亿行数据都会产生巨大的延迟问题。您希望这些数据日志文件,所以你可以聚合它来产生你想要的结果。

我发现存储这些日志作为HTTP请求的作品,甚至写一些东西来存储原始JSON文件有助于采取第二级。

例如,我看到你想要做一个Devices组。你可以使用蒙戈聚集了这一点到类似如下结构的东西:

{ 
    "_id": "20121005_siteKey_device", 
    "hits": 512, 
    "hours": { 
     "0": 52, 
     "1": 31 
    } 
} //mongo structure 

或者,如果你想进一步aggragate到分钟:如果你有更小的数据集,从这个

{ 
    "_id": "20121005_siteKey_device", 
    "hits": 512, 
    "minutes": { 
     "0": 52, 
     "1": 31 
     ... 
     "3600":31 
    } 
} 

除了你可以看看使用Redis。在这里这个链接以峰值:

Metrics using Redis

无论一个有趣的问题来工作,通过。祝你好运!

0

你可以存储由Hour, Device, ...分组的聚集。换句话说,将所有有趣的维度组合在一起。如果没有几个不同的组合(你说有),这个聚合表将会很小。然后,您可以查询聚合(当然,再次聚合),而不是扫描巨大的基表。

请注意,NoSQL数据库不会从根本上改变事情。这个任务你会遇到同样的问题。您需要扫描整个表格或存储集合。这对于SQL Server和NoSQL来说是一样的。