一、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时间作为文档的过期时间

// 对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,在这种情况下由插入到字段的数据来控制文档何时过期,这种场景更加精细化,可灵活的控制文档的过期时间及控制在业务低峰期触发文档过期

// 对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方式进行修改

// 创建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.
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")

六、参考文档

最新文章

  1. 安装cocoaPods的详细步骤
  2. 用原生js实现的链式调用函数
  3. sklearn 增量学习 数据量大
  4. android sdcard信息获取
  5. Code is not literature
  6. poj 2109 Power of Cryptography (double 精度)
  7. 也可以看看GCD(杭州电2504)(gcd)
  8. C#实现阿拉伯数字(小写金额)到大写中文(大写金额)的转换
  9. 美杂志初次取得答应走进google奥秘研讨所Google X
  10. PAT1094:The Largest Generation
  11. 关于form-checkbox 必填项无效的错误
  12. RSA签名的PSS模式
  13. bootstrap网站后台从设计到开发
  14. Educational Codeforces Round 51 (Rated for Div. 2) G. Distinctification(线段树合并 + 并查集)
  15. redis----------windows下安装redis以及PHP的redis扩展
  16. VS调试提示“无法启动程序,“...exe”。系统找不到指定文件
  17. Socket网络编程--简单Web服务器(3)
  18. git获取一个版本相对于另一个版本新增,修改,删除的文件
  19. netcore的NLog使用小记
  20. Linux 终端快捷键整理

热门文章

  1. mysql 优化2 慢查询
  2. Linux安装完后的调优(linux 6)
  3. [LC] 256. Paint House
  4. Chrome开发者调试工具
  5. 安装centos7后不能联网
  6. IOC @Autowired/@Resource/@Qulified的用法实例
  7. Linux 下centos7启动 Tomcat 抛出Can't connect to X11 window server 问题的解决方法
  8. Bar条形图
  9. appium使用相对坐标定位元素
  10. ES插件升级