我在Mongo有很多藏品。大约17亿条记录占用了大约5TB的存储空间。我不再需要无限期地保留这些数据,因此我正在寻找摆脱大多数数据的方法,最好基于“ createdAt”。
我想知道如果添加一个ttl索引最多只能保留一个月的记录会发生什么。我目前有以下索引:
{
"v" : 1,
"key" : {
"createdAt" : 1
},
"name" : "createdAt_1",
"ns" : "someNS.SomeCollection",
"background" : true
}
mongo能够多快删除所有这些数据?据我了解,ttl进程每60秒运行一次。每次都会删除多少数据?
答案 0 :(得分:0)
Timing of the Delete Operation
在后台构建TTL索引时,TTL线程可以在构建索引时开始删除文档。如果您在前台构建TTL索引,则MongoDB将在索引构建完成后立即开始删除过期的文档。
TTL索引不能保证过期的数据将在过期后立即删除。从文档过期到MongoDB从数据库中删除文档之间可能会有一段时间。
删除过期文档的后台任务每60秒运行一次。结果,在文档到期和运行后台任务之间的一段时间内,文档可能会保留在集合中。
因为删除操作的持续时间取决于工作量 您的mongod实例中,过期数据可能会存在一段时间 后台任务运行之间的60秒间隔。
答案 1 :(得分:0)
向这样的大型集合添加TTL索引确实会影响性能。如果在创建TTL时需要继续查询此集合,则可以考虑在过去很远的时候最初创建TTL索引,以使任何文档实际上都不会过期。使用TTL创建索引后,您以后可以调整将文档保留多长时间。
创建该索引后,您可以手动运行查询以删除旧数据,直到更新到最新状态并能够调整TTL,或者缓慢提高TTL,以便能够控制性能影响。
(来源:来自mlab的有关向1TB集合中添加TTL的建议。如果在删除旧文档时不需要保持对数据的访问,则完全忽略此建议)