3

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

例如:

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

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

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

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

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

4

2 回答 2

1

我发现最好的方法是不将原始数据存储在任何类型的数据库中,而是将您要在这些系统中查询的内容存储起来。围绕这个的原因是原始数据很笨重,并且在一天内搜索超过 1 亿行可能会产生巨大的延迟问题,无论您使用什么搜索,特别是如果您拥有整个原始数据集。您想要这些日志文件,因此您可以汇总它以产生您想要的结果。

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

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

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

或者,如果您想进一步汇总到分钟:

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

除此之外,如果你有更小的数据集,你可以考虑使用 Redis。在此链接上取得高峰:

使用 Redis 的指标

不管解决一个有趣的问题。祝你好运!

于 2012-12-04T14:01:07.370 回答
0

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

请注意,NoSQL 数据库的做事方式并没有根本不同。您将在此任务中遇到所有相同的问题。您需要扫描整个表或存储聚合。对于 SQL Server 和 NoSQL,这将是相同的。

于 2012-12-04T14:06:37.313 回答