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索引介绍(超时索引)的更多相关文章

  1. mysql性能优化-慢查询分析、优化索引和配置 MySQL索引介绍

    MySQL索引介绍 聚集索引(Clustered Index)----叶子节点存放整行记录辅助索引(Secondary Index)----叶子节点存放row identifier-------Inn ...

  2. MongoDB索引介绍

    MongoDB中的索引其实类似于关系型数据库,都是为了提高查询和排序的效率的,并且实现原理也基本一致.由于集合中的键(字段)可以是普通数据类型,也可以是子文档.MongoDB可以在各种类型的键上创建索 ...

  3. 每篇半小时1天入门MongoDB——4.MongoDB索引介绍及数据库命令操作

    准备工作 继续连接到mongo C:\Users\zouqi>mongo MongoDB shell version: 3.0.7 connecting to: test 查看数据库和集合 &g ...

  4. Mongodb Manual阅读笔记:CH7 索引

    7索引 Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mongodb Manual阅读笔记 ...

  5. MongoDB优化,建立索引实例及索引机制原理讲解

    MongoDB优化,建立索引实例及索引机制原理讲解 为什么需要索引? 当你抱怨MongoDB集合查询效率低的时候,可能你就需要考虑使用索引了,为了方便后续介绍,先科普下MongoDB里的索引机制(同样 ...

  6. MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划

    这篇文章主要介绍了MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划的相关资料,需要的朋友可以参考下 一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存 ...

  7. MongoDB开发深入之二:索引

    索引分类: 默认索引 单一索引 复合索引 多键索引(数组索引) 全文检索索引 2dsphere 索引 2D索引 ...... 索引属性: 到期TTL 唯一索引 部分索引 稀疏索引 索引通常能够极大的提 ...

  8. [转载]MongoDB开发学习(2)索引的基本操作

    索引能够极大的提高查询的效率.在数据库中简历索引必不可少. 在MongoDB中可以很轻松的创建索引. 默认索引_id_ 开启MongoDB服务器,创建数据库cnblogs,创建集合Users .(关于 ...

  9. MySQL单列索引和组合索引的区别介绍

    MySQL单列索引和组合索引的区别介绍 作者:佚名出处:IT专家网2010-11-22 13:05 MySQL单列索引是我们使用MySQL数据库中经常会见到的,MySQL单列索引和组合索引的区别可能有 ...

  10. MongoDB 创建基础索引、组合索引、唯一索引以及优化

    一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样.其实可以这样说说,索引 ...

随机推荐

  1. jquery checkbox 全选反选代码只能执行一遍,第二次就失败

    遇到问题背景: 在写到购物车的全选交互的时候,商品选中的状态只有在第一次的时候可以,第二次就无法选中:(代码如下) $(".chooseall").click(function() ...

  2. C#高性能大容量SOCKET并发(八):通讯协议

    协议种类 开发Socket程序有两种协议类型,一种是用文本描述的,类似HTTP协议,定义字符集,好处是兼容性和调试方便,缺点是解析文本会损耗一些性能:一种是用Code加结构体,定义字节顺序,好处是性能 ...

  3. 4.Handler之CoreHandler编写

    4.Handler之CoreHandler编写 如图右上角所示,Ray中有两类Handler(SubHandler和PartSubHandler),在使用中,SubHandler派生Actor的Cor ...

  4. Git多帐号配置,管理多个SSH

    查看自己所有的SSH-Key $ cd ~/.ssh $ ls id_rsa id_rsa.pub known_hosts 如果你已经创建过git账号那你可能和我一样会看到只有一个SSH-Key, 这 ...

  5. Codeforce D. Make a Permutation!

    D. Make a Permutation! time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  6. template.compile()方法

    template.compile(source, options) source:必传,渲染模板的内容. options:可选,通常不传.(其实是我还没研究明白) return:一个渲染函数. 示例如 ...

  7. python绘制图形(Turtle模块)

    用python的Turtle模块可以绘制很多精美的图形,下面简单介绍一下使用方法. 需要用到的工具有python,python 的安装这里就不再细说.自行搜索. from turtle import ...

  8. js实现文本框输入文字个数限制代码

    html: <div class="curr_eval_box">                <input type="hidden" n ...

  9. 使用redis所维护的代理池抓取微信文章

    搜狗搜索可以直接搜索微信文章,本次就是利用搜狗搜搜出微信文章,获得详细的文章url来得到文章的信息.并把我们感兴趣的内容存入到mongodb中. 因为搜狗搜索微信文章的反爬虫比较强,经常封IP,所以要 ...

  10. 【机器学习实战 第九章】树回归 CART算法的原理与实现 - python3

    本文来自<机器学习实战>(Peter Harrington)第九章"树回归"部分,代码使用python3.5,并在jupyter notebook环境中测试通过,推荐c ...