我正在将数据插入到集合中以存储用户历史记录(大约100项/秒),并使用聚合框架查询最后一小时的数据(每分钟一次)
为了保持我的收藏最佳,我考虑了两种可能的选择:
哪种解决方案更有效?即对mongo盒子要求不高 - 在I / O,内存使用,CPU等方面(我目前有1个主要和1个辅助,有一些隐藏节点。如果有所不同)
(我可以在我的上限集合中添加一些缓冲区来平均存储3-4小时的数据,如果用户在某些时候变得非常繁忙而没有获得整整一小时的数据)
答案 0 :(得分:5)
使用上限集合会更有效率。加盖的集合通过不允许删除文档或以增加其大小的方式更新它们来保留记录的顺序,因此它总是可以附加到集合的当前末尾。这使得插入比标准集合更简单,更有效。
TTL索引需要为TTL字段维护一个额外的索引,需要使用每个插入进行更新,这是插入的额外减速(当你还要添加索引时,这一点当然无关紧要)使用上限集合时的时间戳)。此外,TTL由后台作业强制执行,后台作业定期运行并占用性能。作业是低优先级的,当有更多高优先级任务要做时,允许MongoDB延迟它。这意味着您不能依赖于准确执行的TTL。因此,当时间间隔的精确准确性很重要时,即使您设置了TTL,也必须在查询中包含时间间隔。
限制集合的一大缺点是很难预测它们真正需要多大。如果您的应用程序扩展,并且您收到的文档比预期的要多得多或者大得多,那么您将开始丢失数据。一般情况下,您应该只使用上限集合来处理过早丢失旧文档的情况。