网站首页 文章专栏 mongodb的TTL索引之删除过期文档机制
mongodb的TTL索引之删除过期文档机制
编辑时间:Dec. 7, 2019, 2:17 p.m. 作者:赵彦昌 浏览量:3482

      本文章目前适用 mongodb:2.2 到 4.2

      过期时间索引(TTL  indexes )是一个只能在单字段上建立的索引. MongoDB可以使用它在一定时间(单体秒)内或指定时间后自动从集合中移除文档。. 数据过期对于某些类型的信息(如机器生成的事件数据、日志和会话信息)非常有用,这些信息只需要在数据库中保留有限的时间。

若要创建TTL索引,请对值为日期或包含日期值的数组的字段使用db.collection.createIndex()方法和 expireAfterSeconds 选项。


例如,要在eventlog集合的lastModifiedDate字段上创建TTL索引,请在mongo shell中使用以下操作:


操作


数据过期

      TTL索引在索引字段值之后的指定秒数之后使文档过期;即过期阈值是索引字段值加上指定秒数。
如果字段是数组,并且索引中有多个日期值,MongoDB使用数组中的最低(即最早)日期值来计算到期阈值。
如果文档中的索引字段不是日期或包含日期值的数组,则文档不会过期。
如果文档不包含索引字段,则文档不会过期。




删除操作

      mongod 会在后台启动一个TTL 线程每60秒运行一次,读取索引中的值,并从集合中删除过期的文档

当TTL线程处于活动状态时,可用db.currentOp()的输出或通过数据库探查器收集的数据中看到删除操作。


删除操作的计时器

For feature compatibility version (fcv) "4.2", MongoDB在索引构建完成后立即开始删除过期的文档。.

For feature compatibility version (fcv) "4.0", 删除操作的时间取决于索引生成类型:

     1.对于前台生成索引,MongoDB只能在生成完成后开始删除过期的文档。.
       2. 对于后台生成索引, MongoDB可以在生成索引处理过期文档时, 立即开始删除这些文档。

前台生成,或后台生成的区别在于,在使用createIndex() 方法时,是否加上background 选项. 比如后台生成索引:

db.people.createIndex( { zipcode: 1}, {background: true} )


关于更多创建索引的细节,请看集合的索引生成

TTL索引不能保证过期的数据在过期后立即被删除。从文档过期到MongoDB从数据库中删除文档之间可能存在延迟

删除过期文档的后台任务每60秒运行一次。因此,在文档到期和后台任务运行之间的时间段内,文档可能会保留在集合中。


副本集

      在副本集成员上,TTL后台线程仅在主成员上运行。辅助成员从主成员复制删除操作。


支持查询

     TTL索引与非TTL索引一样支持查询


限制

      TTL 索引只能创建在单字段上,不支持复合索引

      _id 字段不支持TTL索引

      不能为固定集合(capped collection)创建TTL索引, 因为MongoDB不能从capped collection中删除文档


      不能使用createIndex() 去更改现有TTL索引的expireAfterSeconds 的值。而应使用 collMod 数据库命令与索引集合标志结合使用。否则,要更改现有索引选项的值,必须先删除索引并重新创建。

      如果你要创建的TTL索引字段已经存在非TTL单字段索引,则不能在同一字段上创建TTL索引,因为不能创建具有相同key规范但选项(expireAfterSeconds 选项)不同的索引。要将非TTL单字段索引更改为TTL索引,必须先删除该索引,然后使用expireAfterSeconds选项重新创建。


来说两句吧
最新评论