0

我有一个应用程序,其中任何用户使用的应用程序功能都会连续登录到文本文件中,然后稍后(非高峰时间)计划的应用程序将这些日志记录插入基于 MS SQL Server 的 RDBMS。您可以猜到,这会生成大量数据(因为单个用户会话会生成许多记录,并且有数百名用户整天同时使用该应用程序)。该数据库目前有数百万条记录,主要用于生成基于日期范围的报告,该报告汇总了在给定日期范围内哪个功能使用了多少次,这是数据库出现性能问题的地方。

现在我知道直接的解决方案是修复数据库设计(如果可能的话!)以提高性能。但我不应该建议任何 SQL 设计更改。我应该使用类似于我上面解释的数据集来评估 NoSQL 数据库。

我开始研究 NoSQL 数据库,并被不同类型的 NoSQL 数据库轰炸。在我最初的研究中,我很确定我可以排除面向图形的数据库。Key-Value 存储似乎也不适合我的目的,因为它主要允许我根据我从这篇关于 DynamoDB 的论文中理解的内容只使用键进行查询。虽然要求是对日期范围的大量查询,但按特征查询的选项是可取的。

这给我留下了面向文档的数据库和列族存储

因此,基于所有这些要点,您会为我的案例建议哪个数据库?

PS: 请不要推荐任何基于云的解决方案,因为我不应该将数据迁移到云上!!!

4

2 回答 2

1

任何支持有效范围扫描或分区扫描的东西都适用于您的用例。

这包括 MongoDB、Cassandra、HBase、任何 RDBMS(尤其是那些支持分区的)。我会在这里排除 CouchDB,因为我认为 Javascript map/reduce 无法与用 C/C++/Java 实现的 NoSQL/RDBMS 引擎竞争。

列族存储通常用于处理时间序列。例如,看看基于 HBase的OpenTSDB项目。

最后,您还可以考虑只使用搜索引擎而不是 NoSQL 存储或 RDBMS。搜索引擎(例如 Lucene)越来越多地用于分析工作负载。例如,看看ElasticsearchLogstashKibana三元组。

于 2013-11-06T19:01:06.527 回答
0

我建议RedisSSDB,内置数据类型zset是存储基于时间的数据的理想数据类型。一个序列存储(随时插入和删除),您可以通过时间戳找到。

这是一些代码片段:

$ssdb->zset('z', 'a', 1384423054);
$ssdb->zset('z', 'b', 1384423055);
$ssdb->zset('z', 'c', 1384423056);
$items = $ssdb->zrange('z', 1384423054, 1384423057, $limit=100);

这两个数据库的区别在于Redis只是内存(磁盘用于备份),而SSDB是基于磁盘的,使用内存作为缓存。

于 2013-11-14T09:59:27.413 回答