Mongo TTL与Capped集合的效率比较

6
我正在向一个集合中插入数据来存储用户历史记录(大约每秒100条),并使用聚合框架查询最近一小时的数据(每分钟一次)。
为了保持我的集合最佳状态,我考虑了两个可能的选项:
1. 创建一个带有创建日期TTL索引的标准集合。 2. 创建一个有上限的集合,并查询最近一小时的数据。
哪种方案更有效?即在Mongo数据库上更少地占用I/O、内存使用和CPU等资源。(我目前有一个主节点和一个从节点,还有一些隐藏节点。如果这有区别的话)
(我可以在我的有上限集合上添加一点缓冲,平均存储3-4小时的数据。如果用户在某些时间变得非常繁忙,可能无法获得完整的一小时数据。)

你不试一下就不会知道。因素太多了。 - David says Reinstate Monica
1个回答

13

使用固定大小的集合会更加高效。固定大小的集合通过不允许删除文档或以增加它们的方式更新文档来保留记录顺序,因此始终可以将文档追加到集合的当前末尾,使插入比标准集合更简单和高效。

TTL索引需要维护TTL字段的附加索引,并且需要在每次插入时进行更新,这会导致插入速度变慢(当然,在使用带有时间戳的索引时,也会增加插入时的附加延迟)。此外,TTL是由后台作业强制执行的,该作业定期运行并消耗性能。该作业是低优先级的,MongoDB有权在有更高优先级任务需要完成时延迟它。这意味着您不能依赖于精确执行TTL。因此,当时间间隔的准确性很重要时,即使设置了TTL,您也必须在查询中包括时间间隔。

固定大小集合的一个大缺点是很难预测它们实际需要多大。如果您的应用程序扩展并且您收到的文档比预期的多得多或更大,您将开始丢失数据。通常,只有在丢失旧文档不会对您造成太大影响的情况下才应使用固定大小的集合。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接