我有一个应用程序,其中任何用户使用的应用程序的功能都会连续记录到文本文件中,然后(非高峰时段)计划的应用程序将这些日志记录插入到基于MS SQL Server的RDBMS中。正如您所猜测的,这会产生大量数据(因为单个用户会话将生成许多记录,并且有数百个用户整天同时使用该应用程序)。该数据库目前有数百万条记录,主要用于生成基于日期范围的报告,该报告汇总了在给定日期范围内使用了哪些功能的次数,这是数据库出现性能问题的地方。
现在我知道对此的直接解决方案是修复数据库设计(如果可能的话!)以提高性能。但我不应该建议任何SQL设计更改。我应该使用类似于上面解释的数据集来评估NoSQL数据库。
我开始研究NoSQL数据库,并且我被不同类型的NoSQL数据库轰炸。在我最初的研究中,我很确定我可以排除面向图形的数据库。键值存储似乎也不适合我的目的,因为它主要允许我根据我在DynamoDB上的this论文中所理解的任何内容仅使用键进行查询。虽然要求是对日期范围的重要查询,但是需要按功能查询选项。
这让我留下了面向文档的数据库和column family stores
基于所有这些要点,您会为我的案例建议哪个数据库?
PS: 请不要建议任何基于云的解决方案,因为我不应该在云上迁移数据!!!
答案 0 :(得分:1)
支持高效范围扫描或分区扫描的任何内容都可以正常使用。
这包括MongoDB,Cassandra,HBase,任何RDBMS(特别是支持分区的RDBMS)。我会在这里排除CouchDB,因为我不认为Javascript map / reduce可以与C / C ++ / Java中实现的NoSQL / RDBMS引擎竞争。
列族商店通常用于处理时间序列。例如,看看基于HBase的OpenTSDB项目。
最后,您还可以考虑使用搜索引擎而不是NoSQL商店或RDBMS。搜索引擎(例如Lucene)越来越多地用于分析工作负载。例如,查看Elasticsearch,Logstash,Kibana三元组。
答案 1 :(得分:0)
我建议Redis和SSDB,内置数据类型zset
是存储基于时间的数据的理想数据类型。一个序列存储(随时插入和删除),您可以通过时间戳找到。
以下是一些代码snipets:
$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是基于磁盘的,并使用内存作为缓存。