我目前正在研究后端,以用于具有严格数据聚合要求的项目。主要项目要求如下。
为每个用户存储数百万条记录。用户每年可能有超过100万个条目,所以即使有100个用户,我们每年也会谈到1亿个条目。
必须即时执行这些条目的数据聚合。用户需要能够通过大量可用过滤器对条目进行过滤,然后显示摘要(总计,平均值e.t.c)和结果图表。显然,我无法预先计算任何聚合结果,因为过滤器组合(以及结果集)非常庞大。
用户只能访问自己的数据,但如果可以为所有数据计算匿名统计数据,那就太好了。
数据大部分时间都是批量生产。例如,用户每天上传数据,它可能会有3000条记录。在某些更高版本中,可能会有自动程序,例如每隔几分钟就会以较小批量的100个项目上传。
我做了一个简单的测试,创建一个包含100万行的表,并在mongodb和mysql中执行1列的简单总和,性能差异很大。我不记得确切的数字,但它像mysql = 200ms,mongodb = 20秒。
我也用couchdb进行了测试,效果更差。
看起来很有希望的速度是cassandra,当我第一次发现它时,我非常热情。但是文档很少,我没有找到关于如何对数据执行求和和其他聚合函数的任何可靠示例。这可能吗?
从我的测试(也许我做错了)看来,当前的性能不可能将mongodb用于这样的项目,尽管自动分片功能似乎非常适合它。
是否有人有mongodb数据聚合的经验或有任何可能对项目实施有所帮助的见解?
谢谢, 迪米瑞斯
答案 0 :(得分:3)
如果您正在寻找性能非常高的DBMS并且不需要它是关系型的,那么您可能会考虑使用Cassandra - 尽管如果您拥有数据库集群而不是单个节点,它的优势才会发挥作用。
您没有说出物理架构有什么限制。你确实提到了一个暗示集群的分片。 IIRC MySQL集群也支持分片。
了解系统要支持的并发级别以及如何添加数据(滴加或批处理)也非常有用。
你说“显然我不能预先计算任何聚合结果,因为过滤器组合(以及结果集)是巨大的。”
这是您最大的问题,也是决定系统性能的最重要因素。当然,您无法保持每种可能组合的物化视图,但您最大的性能胜利将是维持有限的预聚合视图并构建可找到最接近匹配的优化器。这并不是那么难。
下进行。
答案 1 :(得分:2)
在需要javascript的用例中,例如map-reduce-jobs,我从未对MongoDB的性能印象深刻。也许它在1.51更好。我没试过。
您还可以尝试Greenplum的免费单节点版本:http://www.greenplum.com/products/single-node/和http://www.dbms2.com/2009/10/19/greenplum-free-single-node-edition/
答案 2 :(得分:1)
或者也许hadoop(http://hadoop.apache.org/)或hadoopdb(http://db.cs.yale.edu/hadoopdb/hadoopdb.html)?
答案 3 :(得分:1)
如果一个简单的100万个文档总和花了20秒在Mongo你可能没有足够的RAM。对Mongo来说,重要的是你可以在内存中维护整个数据集,否则性能会受到影响。你没有提到你是如何计算的,也许这是你的地图缩减代码的问题?关于问题是什么的细节太少,但是我做了更复杂的地图减少了订单量大一些文件,只需花费更少的时间在我的笔记本电脑上运行