我目前正在研究用于具有严格数据聚合要求的项目的后端。项目主要要求如下。
为每个用户存储数百万条记录。用户每年可能拥有超过 100 万个条目,因此即使有 100 个用户,我们每年也会有 1 亿个条目。
这些条目的数据聚合必须即时执行。用户需要能够通过大量可用的过滤器来过滤条目,然后在结果上显示摘要(总计、平均值等)和图表。显然,我无法预先计算任何聚合结果,因为过滤器组合(以及结果集)很大。
用户只能访问自己的数据,但如果可以计算所有数据的匿名统计数据,那就太好了。
数据大部分时间都是批量的。例如,用户每天会上传数据,可能有 3000 条记录。在某些更高版本中,可能会有自动化程序每隔几分钟上传一小批(例如 100 个项目)。
我做了一个简单的测试,创建一个包含 100 万行的表,并在 mongodb 和 mysql 中执行 1 列的简单求和,性能差异巨大。我不记得确切的数字,但大概是 mysql = 200ms , mongodb = 20 秒。
我也用 couchdb 进行了测试,但结果更糟。
看起来速度很有前途的是 cassandra,当我第一次发现它时,我对它非常感兴趣。然而,文档很少,我还没有找到任何关于如何对数据执行求和和其他聚合函数的可靠示例。那可能吗 ?
从我的测试来看(也许我做错了什么),以当前的性能来看,不可能将 mongodb 用于这样的项目,尽管自动分片功能似乎非常适合它。
有没有人有 mongodb 数据聚合的经验或者有任何可能对项目实施有帮助的见解?
谢谢,
季米特里斯
如果您正在寻找一个非常高性能的 DBMS 并且不需要它是关系型的,您可能会考虑 Cassandra - 尽管它的优势只有在您拥有数据库集群而不是单个节点时才会发挥作用。
你没有说物理架构有什么限制。您确实提到了分片,这意味着集群。 IIRC MySQL 集群也支持分片。
了解系统打算支持什么级别的并发性以及如何添加数据(滴灌式或批量式)也非常有用。
您说“显然我无法预先计算任何聚合结果,因为过滤器组合(以及结果集)很大。”
这是您最大的问题,也将是决定系统性能的最重要因素。当然,您无法维护每种可能组合的具体化视图,但您最大的性能胜利将是维护有限的预聚合视图并构建可以找到最接近匹配的优化器。这并不那么难。
C.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)