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