我有一个mongo集合,其中包含少量200万个文档,我有一个我希望运行的查询,它将根据日期字段删除大约700.000个。
删除查询看起来像这样:
db.collection.remove({'timestamp': { $lt: ISODate('XXXXX') }})
确切的日期在这种情况下并不重要,语法是正确的,我知道它会起作用。但是,我也知道它会花费很长时间(上次我们做了类似的事情,花了不到2小时)。
还有另一个进程在我无法停止的同时插入和更新记录。但是,只要那些插入/更新“最终”被执行,我不介意它们被推迟。
我的问题是:有没有办法设置特定查询/操作的优先级,以便在之后发送的所有查询之前运行得更快?在这种情况下,我认为mongo必须在数据库中进行大量交换数据,这无助于提高性能。
答案 0 :(得分:0)
我不知道优先级是否可以微调,因此可能会有更好的答案。
一个简单的解决方法可能是documentation中建议的内容:
注意:对于大型删除操作,将要保存的文档复制到新集合然后在原始集合上使用
drop()
可能会更有效[原文如此]。
另一种方法是编写一个简单的脚本来获取例如500个元素,然后使用$in
删除它们。您可以添加某种sleep()
来限制删除过程。这是recommended in the newsgroup。
如果您将来遇到此问题,可能需要
答案 1 :(得分:0)
如果您的应用需要删除超过一定时间的数据,我建议您使用TTL indexes。 Ex(来自mongodb网站):
db.log.events.ensureIndex( { "status": 1 }, { expireAfterSeconds: 3600 } )
除了按时间删除数据外,它的作用类似于上限集合。对你来说最大的胜利是它在后台线程中工作,你的插入/更新将大部分没有受到伤害。我在基于SaaS的产品中使用这种技术,就像一个魅力。
这可能不是你的用例,但我希望有所帮助。