【MongoDB】索引属性 之 TTL索引(过期自动删除)

本章内容:

  • 行为
  • 限制条件

注意

如果要删除文档以节省存储成本,请考虑使用MongoDB Atlas中的Online Archive。 Online Archive会将不经常访问的数据自动存档到完全托管的S3存储桶中,以实现经济高效的数据分层。

TTL (生存时间值)
TTL是 Time To Live的缩写,来源于计算机网络,指定IP包被路由器丢弃之前允许通过的最大网段数量。

本文中指数据在数据库中的生存时间可以设置为有限的。(编者注)

TTL索引是特殊的单字段索引,MongoDB可使用TTL索引在一定时间后或在定时时间之后自动从集合中删除文档。数据过期对于某些类型的信息很有用,例如机器生成的事件数据,日志和会话信息,它们仅需要在数据库中保留有限的时间。

若要创建TTL索引,请在其值为日期或包含日期值的数组的字段上使用db.collection.createIndex()方法,并且设置expireAfterSeconds选项

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

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

 

一、行为

1.数据过期

从索引字段值(字段类型是日期,所以该字段值就是倒计时的起始时间)起经过指定的秒数后,TTL索引使文档过期;即,到期阈值索引字段值加上指定的秒数

如果字段是数组,并且索引中有多个日期值,则MongoDB使用数组中最低(即最早)的日期值来计算到期阈值。

如果文档中的索引字段不是日期或包含日期值的数组,则该文档不会过期

如果文档没有索引字段,则该文档不会过期

 

2.删除操作

mongod中的后台线程读取索引中的值,并从集合中删除过期的文档。

如果TTL线程处于活动状态,可以在db.currentOp()的输出或数据库分析器收集的数据中看到删除操作信息。

 

3.删除操作时间

一旦索引在primary数据库上构建完成,MongoDB就开始删除过期的文档。有关索引构建过程的更多信息,请参见填充集合上的索引构建

TTL索引不能保证过期的数据将在过期后立即删除。从文档过期时间到MongoDB删除过期文档之间可能会有一定的延迟。

删除过期文档的后台任务每60秒运行一次。结果,在文档到期时间和后台任务运行这个时间段内,文档仍旧可能会保留在集合中。

由于删除操作的持续时间取决于mongod实例的工作负载,因此过期数据的存在时间可能会超过后台任务两次运行的60秒时间间隔(也就是,由于mongod负载,过期数据一次执行未必删除完全,会有过期数据存在超过60秒)。

 

4.中的删除

在副本集成员上,仅当成员处于primary状态时,TTL后台线程才会删除过期文档。当成员处于secondary状态时,TTL背景线程处于空闲状态。secondary成员从primary成员复制删除操作。

 

5.对查询支持

TTL索引对查询的支持,与非TTL索引一样。

 

二、限制

  1. TTL索引是单字段索引。复合索引不支持TTL,并且会忽略expireAfterSeconds选项。
  2. _id字段不支持TTL索引。
  3. 不能在固定集合(capped collection)上创建TTL索引,因为MongoDB无法从固定集合中删除文档。
  4. 不能使用createIndex()更改现有索引的expireAfterSeconds的值。而是将collMod数据库命令与索引收集标志一起使用。否则,要更改现有索引的选项的值,必须首先删除索引并重新创建。
  5. 如果某个字段已经存在非TTL单字段索引,则无法在同一字段上创建TTL索引,因为无法创建具有相同密钥规格且仅选项不同的索引。要将非TTL单字段索引更改为TTL索引,必须首先删除该索引,然后重新创建索引并指定expireAfterSeconds选项。

参考原文:https://docs.mongodb.com/manual/core/index-ttl/

你可能感兴趣的:(MongoDB)