mongodb的TTL索引介绍(超时索引)
TTL索引是mongodb新支持的用于延时自动删除记录的一种索引。它仅包含一个字段,该字段值需要是Date()类型,并且不支持复合索引。可以指定某条记录在延时固定时间后自动删除。数据自动超时删除主要用在系统生成的事件、日志或者会话信息等不需要永久存储的数据。
- 创建语法

在集合eventlog的字段"lastModifiedDate"上创建延时1小时自动删除的TTL索引,其中"expireAfterSeconds"是超时字段,单位是秒。
- 数据超时
TTL索引会按设置的超时时间,自动定期把符合条件的文档删除,这里的符合是指索引字段的时间值超时:
1. 该字段如果是一个数组,并且有多个有效的时间值,那么mongodb会按最早的时间值来计算是否超时。
2. 如果某文档的该字段值不是Date类型或者数组中无有效时间值,那么该文档不会过期。
3. 如果一个文档没有索引字段,那么它也不会过期。
- 删除操作
mongodb后台启动了一个线程来定期查询并删除符合条件的文档。
当TTL线程在执行的时候,你可以通过db.currentOp() 查询执行状态。
- 删除操作的执行时间
如果以后台的方式创建了TTL索引,系统可以边创建索引边执行删除操作。如果是前台创建方式,则需要在创建完成后开始执行删除操作。
后台线程会每个1分钟执行一次删除操作,因此TTL索引并不能保证文档在过期的时间点就能被删除,从文档过期到被删除可能会有一段间隔时间,这个间隔包含了线程执行的间隔和执行时删除文档的时间。
- 复制组
在复制组的成员中,只有主节点的后台线程会删除文档,其他从节点会同步这个删除操作。
- 是否支持查询
支持查询时使用TTL索引,同普通的索引一样。
- 注意事项
1. TTL索引仅支持一个字段,不能支持复合索引。
2. _id字段不支持TTL索引。
3. 不能再固定大小的集合上创建TTL索引。
4. 不能通过createIndex()接口来改变expireAfterSeconds的值,可以通过"collMod"命令,或者先删除再创建的方式。
5. 不能在已经建立索引的字段创建TTL索引。
- 示例
1. 创建索引
mongos> db.eventlog.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 60 } )
{
"ok" : 1
}
2. 插入4条记录
mongos> db.eventlog.insert({"title":"mongodb 1","lastModifiedDate":new Date()})
WriteResult({ "nInserted" : 1 })
mongos> db.eventlog.insert({"title":"mongodb 2","lastModifiedDate":new Date()})
WriteResult({ "nInserted" : 1 })
mongos> db.eventlog.insert({"title":"mongodb 3","lastModifiedDate":new Date()})
WriteResult({ "nInserted" : 1 })
mongos> db.eventlog.insert({"title":"mongodb 4","lastModifiedDate":new Date()})
3. 查询记录
mongos> db.eventlog.find()
{ "_id" : ObjectId("5a9697a671d2645a6fa3f9cb"), "title" : "mongodb 1", "lastModifiedDate" : ISODate("2018-02-28T11:51:02.804Z") }
{ "_id" : ObjectId("5a9697aa71d2645a6fa3f9cc"), "title" : "mongodb 2", "lastModifiedDate" : ISODate("2018-02-28T11:51:06.393Z") }
{ "_id" : ObjectId("5a9697ad71d2645a6fa3f9cd"), "title" : "mongodb 3", "lastModifiedDate" : ISODate("2018-02-28T11:51:09.416Z") }
{ "_id" : ObjectId("5a9697c671d2645a6fa3f9ce"), "title" : "mongodb 4", "lastModifiedDate" : ISODate("2018-02-28T11:51:34.499Z") }
大概过了90s,再查询
mongos> db.eventlog.find()
mongos>
果然同时消失了,说明执行超时删除不是实时的,而是60秒执行一次。
mongodb的TTL索引介绍(超时索引)的更多相关文章
- mysql性能优化-慢查询分析、优化索引和配置 MySQL索引介绍
MySQL索引介绍 聚集索引(Clustered Index)----叶子节点存放整行记录辅助索引(Secondary Index)----叶子节点存放row identifier-------Inn ...
- MongoDB索引介绍
MongoDB中的索引其实类似于关系型数据库,都是为了提高查询和排序的效率的,并且实现原理也基本一致.由于集合中的键(字段)可以是普通数据类型,也可以是子文档.MongoDB可以在各种类型的键上创建索 ...
- 每篇半小时1天入门MongoDB——4.MongoDB索引介绍及数据库命令操作
准备工作 继续连接到mongo C:\Users\zouqi>mongo MongoDB shell version: 3.0.7 connecting to: test 查看数据库和集合 &g ...
- Mongodb Manual阅读笔记:CH7 索引
7索引 Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mongodb Manual阅读笔记 ...
- MongoDB优化,建立索引实例及索引机制原理讲解
MongoDB优化,建立索引实例及索引机制原理讲解 为什么需要索引? 当你抱怨MongoDB集合查询效率低的时候,可能你就需要考虑使用索引了,为了方便后续介绍,先科普下MongoDB里的索引机制(同样 ...
- MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划
这篇文章主要介绍了MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划的相关资料,需要的朋友可以参考下 一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存 ...
- MongoDB开发深入之二:索引
索引分类: 默认索引 单一索引 复合索引 多键索引(数组索引) 全文检索索引 2dsphere 索引 2D索引 ...... 索引属性: 到期TTL 唯一索引 部分索引 稀疏索引 索引通常能够极大的提 ...
- [转载]MongoDB开发学习(2)索引的基本操作
索引能够极大的提高查询的效率.在数据库中简历索引必不可少. 在MongoDB中可以很轻松的创建索引. 默认索引_id_ 开启MongoDB服务器,创建数据库cnblogs,创建集合Users .(关于 ...
- MySQL单列索引和组合索引的区别介绍
MySQL单列索引和组合索引的区别介绍 作者:佚名出处:IT专家网2010-11-22 13:05 MySQL单列索引是我们使用MySQL数据库中经常会见到的,MySQL单列索引和组合索引的区别可能有 ...
- MongoDB 创建基础索引、组合索引、唯一索引以及优化
一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样.其实可以这样说说,索引 ...
随机推荐
- properties文件中中文不能显示或者中文乱码
1.properties 文件中文乱码问题 鼠标“右击”文件 => Resource => Text file encoding => UTF-8 2.properties 文件解析 ...
- mybatis-pageHelper做分页
Mybatis-PageHelpera是一个很好的第三方分页插件,支持很多数据库,几乎主流的数据库都支持 github地址:https://github.com/pagehelper/Mybatis- ...
- mysql-关联查询
MySQL关联查询的三种写法: SELECT * FROM film JOIN film_actor ON (film.film_id = film_actor.film_id);SELECT * F ...
- [转]怎么查看和修改 MySQL 的最大连接数?
使用 MySQL 数据库的站点,当访问连接数过多时,就会出现 "Too many connections" 的错误.出现这种错误有两种情况,一种是网站访问量实在太大,服务器已经负担 ...
- 利用vanitygen生成比特币个性地址的教程
比特币怎么生成地址?大家都知道比特币地址都是以1开头的一串乱码,很多朋友会新建过一排地址然后在里面挑选,下面小编为大家分享下比特币生成个性地址方法. 其实就是使用vanitygen软件来生成个性化 ...
- nginx添加编译lua模块
一 .安装LuaJit 1.下载LuaJit # wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz 2.编译安装 # tar xzvf LuaJI ...
- python_缩进_格式化代码
pycharm如何格式化代码? ctrl + alt + l pycharm如何缩进代码? tab 向右缩进4格 shift + tab 向左缩进4格
- 微信支付JSAPI公众号支付授权目录
详情 http://yangjunwei.com/a/1815.html
- VisionPro笔记(1):动态创建控件
VisionPro学习笔记(1):动态创建控件 有的时候可能需要在程序中动态创建控件,VisionPro实例中提供了一例动态创建Blob控件的方法.当然,动态创建过多的控件会极大的消耗系统的资源,建 ...
- echo 0000
一个奇怪的问题,正常状态下如果sql插入失败,则输出0000,代码如下: $stmt=$db->prepare("insert into message(user,title,cont ...