什么是存储趋势数据的最佳方式?

8
我目前正在构建一个应用程序,我正在导入约15,000个产品的统计数据。目前,如果我为每个来源的每天统计数据维护一个数据库表,每天将增加15,000行数据(每行主要为浮点数、整数等5-10个字段)。显然,这意味着每年向一个表中插入超过500万条记录。
这并不让我太担心,因为我担心从其他来源带来数据(从而使数据库的大小增加500万条记录,每个新来源都是如此)。
现在,数据是基于统计/趋势的数据,并且基本上每个记录每天只有1次写入,但会有很多读取。但是,为了进行即时报告和图形化,我需要根据规则(日期范围、值范围等)快速访问数据子集。
我的问题是,这是存储数据的最佳方式(MySQL InnoDb表),还是有更好的方法来存储和处理统计/趋势数据?
此时我考虑的其他选项: 1.多个数据库(每个产品一个),其中每个数据源都有单独的表。 (例如数据库:ProductA,表:Source_A、Source_B、Source_C) 2.一个数据库,多个表(每个产品/数据源一个) (例如数据库:Products,表:ProductA_SourceA、ProductA_SourceB等) 3.数据库中包含所有“事实”的或特定产品信息,而所有的统计数据在csv、xml、json(平面文件)中以分离目录的形式存储。
到目前为止,这些选项都不是很可管理,每个选项都有其优缺点。我需要在进入开发阶段之前找到一个合理的解决方案。
3个回答

2
您可以尝试使用基于列的数据库。这些类型的数据库在您所描述的分析查询方面要好得多。有几个选择:

http://en.wikipedia.org/wiki/Column-oriented_DBMS

我们使用InfiniDB的经验非常好:

http://infinidb.org/

"而且Infobright看起来也不错:"

http://www.infobright.com/

InfiniDB和Infobright都有免费的开源社区版本,因此我建议使用它们来获取一些性能优化方面的基准数据。您可能还希望将数据进行分区以提高性能。

我找到了一份关于MySQL使用基于列的引擎的PDF文件:http://forge.mysql.com/w/images/5/54/MySQLColumnDatabases.pdf,我将进一步研究这个选项,我之前从未听说过基于列的存储方式,这可能是我正在寻找的东西。 - Aaron Murray

2
这有点取决于你的数据长什么样,以及你想运行的聚合/趋势类型。大多数关系型数据库都可以很好地处理这种时间序列数据。即使有数十亿条记录,适当的索引和分区也能快速找到所需的记录。Oracle、MySQL、SQL Server等数据库属于此类别。
假设你处理的产品是股票,每天都会获得新的价格(非常现实的情况)。新交易所、股票、交易频率将使这些数据呈指数级增长。但是,你可以通过交易所或地区对数据进行分区。
各种商业智能工具也能够协助在检索前有效地预聚合数据。这基本上就是所建议的面向列的数据库。(数据仓库和OLAP结构可协助事先操纵和聚合数据集)。
与数据仓库的概念类似,如果只是聚合需要太长时间,你可以在过夜时进行聚合,生成更快速查询的结构。在之前的例子中,你可能只需要很少地检索大量的数据块,但更经常地需要某些聚合,如52周高点。你可以将大量原始数据存储在一个格式中,然后每晚让作业仅处理你需要的内容,并将其放入一个表中,其中每个股票只有3或4个数据点,而不是数千个。
如果你要跟踪的趋势真的很复杂,或者需要使用预构建的分析和数据挖掘算法,那么完整的商业智能解决方案可能值得研究。
如果数据结构不太规范,你可以尝试使用Hadoop或Mongo等NoSQL数据库,尽管我对数据库的了解更加专注于关系型格式。

1

将数据从关系型转换为非关系型,如图形化;将数据转换为更好和有组织的形式,如使用数据集市和数据湖;使用数据挖掘算法;通过使用诸如MapReduce等技术一起处理数据;将ACID属性转换为BASIC。


1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接