将Mongo TTL索引添加到大集合

时间:2019-03-01 00:52:25

标签: mongodb ttl

我在Mongo有很多藏品。大约17亿条记录占用了大约5TB的存储空间。我不再需要无限期地保留这些数据,因此我正在寻找摆脱大多数数据的方法,最好基于“ createdAt”。

我想知道如果添加一个ttl索引最多只能保留一个月的记录会发生什么。我目前有以下索引:

{
        "v" : 1,
        "key" : {
                "createdAt" : 1
        },
        "name" : "createdAt_1",
        "ns" : "someNS.SomeCollection",
        "background" : true
}

mongo能够多快删除所有这些数据?据我了解,ttl进程每60秒运行一次。每次都会删除多少数据?

2 个答案:

答案 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的建议。如果在删除旧文档时不需要保持对数据的访问,则完全忽略此建议)