一、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")

六、参考文档

MongoDB TTL索引的使用的更多相关文章

  1. mongodb的TTL索引介绍(超时索引)

    TTL索引是mongodb新支持的用于延时自动删除记录的一种索引.它仅包含一个字段,该字段值需要是Date()类型,并且不支持复合索引.可以指定某条记录在延时固定时间后自动删除.数据自动超时删除主要用 ...

  2. MongoDB自动删除过期数据--TTL索引

      前序: 由于公司业务需求,对于3个月前的过期数据需要进行删除动作,以释放空间和方便维护 本来想的是使用crontab写个脚本定时执行,但是看到Mongo本身就有自动删除过期数据的功能,所以还是用一 ...

  3. MongoDB 学习笔记之 TTL索引,部分索引和文本索引

    TTL索引: TTL集合支持mongodb对存储的数据进行失效时间设置,经过指定的时间段后.或在指定的时间点过期,集合自动被mongod清除.这一特性有利于对一些只需要保存一定时间的数据信息进行存储, ...

  4. MongoDB数据库索引

    前面的话 索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录.这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查 ...

  5. MongoDb进阶实践之七 MongoDB的索引入门

    一.引言     好久没有写东西了,MongoDB系列的文章也丢下好长时间了.今天终于有时间了,就写了一篇有关索引的文章.一说到"索引",用过关系型数据库的人都应该知道它是一个什么 ...

  6. MongoDB 创建索引的语法

    1.为普通字段添加索引,并且为索引命名 db.集合名.createIndex( {"字段名": 1 },{"name":'idx_字段名'}) 说明: (1)索 ...

  7. 五、MongoDB的索引

    一.MongoDB的下载.安装与部署 二.MongoDB的基础知识简介 三.MongoDB的创建.更新和删除 四.MongoDB的查询 五.MongoDB的索引 1.简介 它就像是一本书的目录,如果没 ...

  8. mongo ttl索引

    db.log_events.find()                                     # 查找log_events里的所有数据   db.log_events.create ...

  9. mongodb数据库索引管理

    1:ensureIndex() 方法 MongoDB使用 ensureIndex() 方法来创建索引. 语法 ensureIndex()方法基本语法格式如下所示: }) 语法中 Key 值为你要创建的 ...

随机推荐

  1. Qt 延时处理的几种办法

    有些时候,我们需要程序延时一会儿: 这里提供四种方法: 1.多线程程序使用QThread::sleep()或者QThread::msleep()或QThread::usleep()或QThread:: ...

  2. 选拔赛 hash 字符串匹配 哈希算法(白书p374)

    hash   Description dr所在国度的有个奇怪的规定:他们的字母不是a~z,而是用1~1000表示. 利用这个奇怪的规定,dr想出了一个好玩的游戏:首先给出n个字符串(当然每个字符用1~ ...

  3. 组合数学--容斥原理&鸽巢原理

    一次会议由1990位数学家参加,每人至少有1327位合作者.证明可以找到4位数学家,他们当中每两个人都合作 优质解答 这题可以分两步来做.第一,先证明一定有三个人,他们相互合作过.可以先找两个相互合作 ...

  4. Ionic3学习笔记(八)使iOS端、Android端 Navbar 透明化

    本文为原创文章,转载请标明出处 若要使iOS端 Navbar 透明,只需要给 ion-navbar 添加 transparent 属性,但是Android端依旧会有一条border在,所以再给 ion ...

  5. Java Timer和TimerTask

    Timer是JDK中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的任务,可以指定一次或多次. TimerTask是一个实现了Runnable接口的抽象类,代表一个可被执行的任 ...

  6. 任务框架--Quartz 配置文件

    配置文件 Quartz 有一个叫做quartz.properties的配置文件,它允许你修改框架运行时环境.缺省是使用 Quartz.jar 里面的quartz.properties 文件.你应该创建 ...

  7. 手机视频APP将关闭 生态梦成空的三星如何自救?

    生态梦成空的三星如何自救?"> 三星如今的处境,只能用"屋漏偏逢连夜雨"来形容.继营收.利润.智能手机销量等大幅下滑之后,裁员也接踵而来,股价的下跌也自然在情理之中 ...

  8. linux记录每次登陆的历史命令

    编辑/etc/profile,增加如下代码 #Record history operation USER_IP=`>/dev/null |awk '{print $NF}' |sed -e 's ...

  9. java基础知识点补充---二维数组

    #java基础知识点补充---二维数组 首先定义一个二维数组 int[][] ns={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12}, {13,14,15,16} }; 实现遍 ...

  10. 国产数据库适配publiccms开源项目

    金仓数据库适配 操作说明: 一.在程序的所有实体层添加schema=”public”(这里的public是根据数据库定义的模式) 二.切换数据库,修改配置文件cms.properties里面的cms. ...