MongoDB TTL索引的使用

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

MongoDB TTL索引的使用

ZhenXing_Yu   2020-03-17 我要评论
[toc] ## 一、TTL索引介绍 >TTL全称是(Time To Live),TTL索引能对一个单列配置过期属性来`实现对文档的自动过期删除`,我们可以在对字段创建索引时添加`expireAfterSeconds`选项将索引转换为TTL索引,该`字段需要是date类型`,在以下几种场景下即使索引设置了expireAfterSeconds属性也不会生效 - 如果该字段不是date类型,则文档不会过期 - 如果文档没包含索引的这个字段,则文档不会过期 ## 二、TTL索引运行逻辑 >- MongoDB会开启一个后台线程读取该TTL索引的值来判断文档是否过期,但不会保证已过期的数据会立马被删除,因后台线程`每60秒触发一次删除任务`,且如果删除的数据量较大,会存在上一次的删除未完成,而下一次的任务已经开启的情况,导致过期的数据也会出现超过了数据保留时间60秒以上的现象。 >- 对于副本集而言,`TTL索引的后台进程只会在primary节点开启`,在从节点会始终处于空闲状态,从节点的数据删除是由主库删除后产生的oplog来做同步。 >- TTL索引除了有expireAfterSeconds属性外,`和普通索引一样`。 ## 三、TTL索引的限制 - 只支持对`单个字段创建TTL索引`,复合索引不支持expireAfterSeconds选项 - `_id列不支持`TTL索引 - `固定集合(capped collection)不支持`TTL索引 - 不支持用createIndex() 修改expireAfterSeconds属性,但可以`用collMod命令修改`,或者重建索引,但重建对于大集合成本较高,建议用collMod方式 - 一个列只能创建普通索引或TTL索引,`不能同时对一个列创建这2种类型索引`(实际TTL索引本身就是普通索引,只是多了一个过期属性) - 如果一个`列已经存在索引,则需要先将该索引drop后才能重建为TTL索引`,不能直接转换 ## 四、TTL索引的使用场景 ### 1. 指定具体的过期时间属性 >该场景是在创建索引时明确指定一个expireAfterSeconds时间作为文档的过期时间 ```javascript // 对log_events集合的createdAt字段创建TTL索引且设置expireAfterSeconds过期时间为3600秒(1小时) onepiece:PRIMARY> db.log_events.createIndex( { "createdAt": 1 }, { expireAfterSeconds: 3600 } ) // 对文档插入数据,包含createdAt字段,则该文档会在1小时候字段删除 onepiece:PRIMARY> db.log_events.insert( { "createdAt": new Date(), "logEvent": 2, "logMessage": "Success!" } ) ``` ### 2. 插入一个具体的过期时间 >该场景是在创建索引时将expireAfterSeconds设置为0,在这种情况下由插入到字段的数据来控制文档何时过期,这种场景更加精细化,可灵活的控制文档的过期时间及控制在业务低峰期触发文档过期 ```javascript // 对log_events集合的expireAt创建TTL索引,并设置expireAfterSeconds属性为0 onepiece:PRIMARY> db.log_events.createIndex( { "expireAt": 1 }, { expireAfterSeconds: 0 } ) // 对文档插入数据,包含expireAt字段,该文档过期时间就是expireAt字段记录的时间 onepiece:PRIMARY> db.log_events.insert( { "expireAt": new Date('Jan 16, 2020 14:00:00'), "logEvent": 2, "logMessage": "Success!" } ) ``` ### 3. TTL属性的修改(collMod) >对于TTL索引的expireAfterSeconds的属性,可以用collMod方式进行修改 ```javascript // 创建TTL索引设置1小时过期属性 onepiece:PRIMARY> db.log_events.createIndex( { "createdAt": 1 }, { expireAfterSeconds: 3600 } ) { "createdCollectionAutomatically" : true, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 } // 查看索引定义 onepiece:PRIMARY> db.log_events.getIndexes() [ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.log_events" }, { "v" : 2, "key" : { "createdAt" : 1 }, "name" : "createdAt_1", "ns" : "test.log_events", "expireAfterSeconds" : 3600 } ] // 修改索引定义,将一小时文档过期改为60秒 onepiece:PRIMARY> db.runCommand( { collMod: "log_events", index: { keyPattern: { createdAt: 1 }, expireAfterSeconds: 60 } }) // 返回值: { "expireAfterSeconds_old" : 3600, "expireAfterSeconds_new" : 60, "ok" : 1 } ``` ## 五、Date类型 - `Date()` method which returns the current date as a string. - `new Date()` constructor which returns a Date object using the ISODate() wrapper. - `ISODate()` constructor which returns a Date object using the ISODate() wrapper. ```javascript onepiece:PRIMARY> Date() Thu Jan 16 2020 14:48:40 GMT+0800 (CST) onepiece:PRIMARY> new Date() ISODate("2020-01-16T06:48:48.655Z") onepiece:PRIMARY> ISODate() ISODate("2020-01-16T06:48:53.673Z") ``` ## 六、参考文档 - https:/https://img.qb5200.com/download-x/docs.mongodb.com/manual/core/index-ttl/index.html

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们