TTL索引(TTL Indexes)

TTL索引指定仅包含一个字段的索引,让MongoDB在经过一定的时间或者指定的时间,自动的删除文档数据。数据过期对于那些只需要保留有限时间的数据十分的有用,如:机器产生的事件数据、日志和session信息。

使用db.collection.createIndex()方法中的expireAfterSeconds参数来创建TTL Indexes,它可以接受单个日期或日期数组。

例如,在eventlog集合的lastMoifiedDate字段上创建TTL index, 可以使用如下的mongo 命令:

db.eventlog.createIndex({"lastModifiedDate":1}, {expreAfterSeconds:3600})

Behavior

数据过期 Expiration of Data

从索引字段数据开始计算,经过指定的秒数后,TTL索引将标识文档过期;换句话说,过期的阀值是索引字段的值加上指定数值的秒数。

如果字段是个数组,包含多个值,MongoDB将使用数组中最小的值来计算阀值。

如果索引字段的值不是日期类型或日期数组,文档将不会过期。

如果文档不包含TTL索引字段,文档也将不会过期。

删除操作

在mongod中,有一个后台的线程,从TTL索引中读取值,并移除过期的文档。

当TTL线程工作时,可以使用db.currentOp()来观察到删除操作,或使用database profiler

删除操作的时机

当你在后台创建一个TTL索引时,TTL线程将开始删除的工作。如果你使用foreground方式来创建索引,MongoDB将在索引创建完成时,开始删除处理。

TTL索引无法保证数据在过期时,立即被删除。数据过期到被删除,中间会存在一个延迟的时间。

移除过期文档的后台任务,每60秒执行一次。在下一次任务启动前,过期的数据都将保留着。

同时删除文档的操作,依赖于mongod实例,过期的数据,可能被保留超过60秒的时间,直到删除任务运行。

Replica Sets

在Replica 集群下,TTL后台线程只在primary下进行工作,并删除primary中的数据。secondary成员则由primary触发删除操作。

查询支持

在查询上,TTL索引与非TTL索引并无区别。

Record Allocation on MMAPv1

With the MMAPv1 storage engine, a collection with a TTL index has usePowerOf2Sizes automatically enabled. You cannot modify this setting for the collection. As a result of enabling usePowerOf2Sizes, MongoDB must allocate more disk space relative to data size. This approach helps mitigate the possibility of storage fragmentation caused by frequent delete operations and leads to more predictable storage use patterns.

限制 Restrictions

  • TTL索引只能使用在单个字段的索引上,复合的索引无法使用TTL。
  • _id字段无法使用TTL索引。
  • 无法在capped collection上创建TTL索引,因为无法删除文档。
  • 无法在已经存在的索引上使用createIndex()来更改expireAfterSeconds的值。替代的,可以使用collMod命令的index flag。换句话说,要更改已经存在的索引的expireAfterSeconds的值,你必须先将索引删除,再创建。
  • 同样的,也无法在一个已经存在非TTL索引的字段上,再次创建TTL索引。你也需要先将原索引删除,再创建TTL索引。

results matching ""

    No results matching ""