首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有多个聚合列的100 m/月行的方法

问具有多个聚合列的100 m/月行的方法
EN

Stack Overflow用户
提问于 2012-12-04 12:18:41
回答 2查看 307关注 0票数 3

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

例如:

  • 从上个月开始,我需要按日和小时分组的columnX总和。
  • 我需要columnX的总和,按月分组的columnY平均数和去年的设备。

必须是原始数据。这一要求将导致平均每月1亿条记录。我不能存储任何金额,因为我必须为每个分段列组合存储所有可能的和。

什么样的数据库引擎/设计最适合这样的任务?最初,对于应用程序,我们选择了MySQL数据库,但在选择的时候,我们并不完全了解需要提取的数据结构和统计信息。现在,当我知道它时,我想到了表分区,但我不熟悉它,也不确定它是否真的有帮助,因为范围很广。如果它没有帮助,如果MySQL失败了这个任务,不管是表格设计,怎么办?比如MongoDB之类的非关系引擎?

查询的要求-不超过2-3秒.

被认为是用于数据库处理的公司硬件资源--几个高质量的服务器,但肯定不是几十个或数百个。

EN

回答 2

Stack Overflow用户

发布于 2012-12-04 14:01:07

我发现最有效的方法不是将原始数据存储在任何类型的数据库中,而是在这些系统中存储您想要查询的内容的聚合。这其中的原因是原始数据很笨重,一天内搜索可能出现的1亿行将产生一个巨大的延迟问题,而不管您搜索的是什么,特别是如果您拥有整个原始数据集的话。不过,您需要这些日志文件,以便可以对其进行聚合以生成所需的结果。

我发现,在HTTP请求工作时存储这些日志,或者甚至编写一些东西来存储原始JSON文件,都有助于将其提升到第二层。

例如,我看到你想要做一个设备组。您可以使用Mongo将其聚合成类似于以下结构的内容:

代码语言:javascript
复制
{
    "_id": "20121005_siteKey_device",
    "hits": 512,
    "hours": {
        "0": 52,
        "1": 31
    }
} //mongo structure

或者如果你想把时间再延长到几分钟:

代码语言:javascript
复制
{
    "_id": "20121005_siteKey_device",
    "hits": 512,
    "minutes": {
        "0": 52,
        "1": 31
        ...
        "3600":31
    }
}

除此之外,如果您有更小的数据集,您可以使用Redis。在此链接处设置一个峰值:

使用Redis的度量

不管是个有趣的问题都要解决。祝好运!

票数 1
EN

Stack Overflow用户

发布于 2012-12-04 14:06:37

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

请注意,NoSQL数据库所做的事情并没有根本上的不同。你在这个任务上也会遇到同样的问题。您需要扫描整个表或存储聚合。这对于Server和NoSQL来说都是一样的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13702732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档