优先考虑特定的长期运行操作

时间:2013-02-04 13:59:38

标签: mongodb

我有一个mongo集合,其中包含少量200万个文档,我有一个我希望运行的查询,它将根据日期字段删除大约700.000个。

删除查询看起来像这样:

db.collection.remove({'timestamp': { $lt: ISODate('XXXXX') }})

确切的日期在这种情况下并不重要,语法是正确的,我知道它会起作用。但是,我也知道它会花费很长时间(上次我们做了类似的事情,花了不到2小时)。

还有另一个进程在我无法停止的同时插入和更新记录。但是,只要那些插入/更新“最终”被执行,我不介意它们被推迟。

我的问题是:有没有办法设置特定查询/操作的优先级,以便在之后发送的所有查询之前运行得更快?在这种情况下,我认为mongo必须在数据库中进行大量交换数据,这无助于提高性能。

2 个答案:

答案 0 :(得分:0)

我不知道优先级是否可以微调,因此可能会有更好的答案。

一个简单的解决方法可能是documentation中建议的内容:

  

注意:对于大型删除操作,将要保存的文档复制到新集合然后在原始集合上使用drop()可能会更有效[原文如此]。

另一种方法是编写一个简单的脚本来获取例如500个元素,然后使用$in删除它们。您可以添加某种sleep()来限制删除过程。这是recommended in the newsgroup

如果您将来遇到此问题,可能需要

  • 使用逐日收集,这样您就可以在数据变得足够老时简单地删除整个集合(这会使聚合变得更难),
  • 使用TTL-Collection项目将自动超时,不需要一堆删除。

答案 1 :(得分:0)

如果您的应用需要删除超过一定时间的数据,我建议您使用TTL indexes。 Ex(来自mongodb网站):

db.log.events.ensureIndex( { "status": 1 }, { expireAfterSeconds: 3600 } )

除了按时间删除数据外,它的作用类似于上限集合。对你来说最大的胜利是它在后台线程中工作,你的插入/更新将大部分没有受到伤害。我在基于SaaS的产品中使用这种技术,就像一个魅力。

这可能不是你的用例,但我希望有所帮助。