mongo ttl索引
- >db.log_events.createIndex( { "createTime": 1 }, ---字段名称
- { expireAfterSeconds: 60*60 } ) ---过期时间(单位秒)
- >db.log_events.getIndexes() ---查看索引
- [
- {
- "v" : 1,
- "key" : {
- "_id" : 1
- },
- "name" : "_id_",
- "ns" : "tt.t1"
- },
- {
- "v" : 1,
- "key" : {
- "createTime" : 1
- },
- "name" : "createTime_1",
- "ns" : "tt.t1",
- "expireAfterSeconds" : 3600
- }
- ]
修改TTL索引的expireAfterSeconds属性值:
- db.runCommand( { collMod: "log_events", ---集合名
- index: { keyPattern: { createTime: 1 }, ---createTime为具有TTL索引的字段名
- expireAfterSeconds: 7200 ---修改后的过期时间(秒)
- }})
虽然上面的方法可以实现自动过期删除,但是如果白天业务很忙,频繁的删除数据势必会增加负载,所以我想着晚上定时删除过期数据(如果晚上业务量少的话)
- >db.log_events.createIndex( { "expireTime": 1 }, ---字段名称
- { expireAfterSeconds: 0 } ) ---过期时间(单位秒)
- >db.log_events.insert( {
- "expireTime": new Date('Jan 22, 2016 23:00:00'), ---此文档将在2016-1-22的23点自动删除
- "logEvent": 2,
- "logMessage": "Success!"} )
一、TTL索引
创建方法
db.collection.createIndex(keys, options)
options:
expireAfterSeconds 指定多少秒或者包含日期值的数组
创建示例
db.eventlog.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 3600 } )
何时失效
在指定的时间达到后失效,也即是索引字段的值加上一个特定的秒数之后
如果索引字段是一个数组,即索引字段上存在着多个日期值,此时MongoDB取最小值加上失效时间(lowest())
对于非日期字段或不包含日期数组的索引字段,文档不会失效
对于不包含索引字段的文档,文档不会失效
删除操作
mongod的一个后台线程会读取索引的值并将失效的文档从集合移除
当TTL线程被激活后,可以从db.currentOp()或者从profile观察到删除操作
何时删除
当基于后台方式创建索引时,TTL线程能够在索引创建期间开始删除失效文档
当基于前台方式创建索引时,TTL线程在索引创建完成后开始删除失效文档
TTL索引的删除不能完全保证失效期后一定删除,存在一定延迟(取决于mongod的工作负载)
TTL删除文档后台线程每60s移除失效文档(因此可能存在已过失效期,文档还在的情形)
在副本集环境中,TTL后台线程仅仅在主副本上工作,辅助副本上由复制操作实现
在使用TTL索引查询时,与使用非TTL索引一样
一些限制
不能基于已经存在索引的字段创建TTL索引以及非日期字段创建TTL索引,文档不会失效
TTL索引不支持基于多个字段的复合索引
不支持定长集合
二、TTL索引示例
# mongo --shell localhost:27000 TTLData.js
MongoDB shell version: 3.2.11
connecting to: localhost:27000/test
repSetTest:PRIMARY> addTTLTestData() //添加集合数据
Create three records in database each with a create time that is 1 minute apart
Created three test documents, oldest being 4 mins old
Now create a TTL index with expiry of 5 mins on the createDate field as follows
db.ttlTest.ensureIndex({createDate:1}, {expireAfterSeconds:300})
repSetTest:PRIMARY> db.ttlTest.find() //当前向集合里插入了3个文档
{ "_id" : 1, "createDate" : ISODate("2017-03-10T03:23:01.169Z") }
{ "_id" : 2, "createDate" : ISODate("2017-03-10T03:24:01.169Z") }
{ "_id" : 3, "createDate" : ISODate("2017-03-10T03:25:01.169Z") }
//下面为测试集合上的文档添加索引,即5分钟后索引失效
repSetTest:PRIMARY> db.ttlTest.createIndex({createDate:1}, {expireAfterSeconds:300})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1, // Author : Leshami
"numIndexesAfter" : 2, // Blog : http://blog.csdn.net/leshami
"ok" : 1
}
//查找文档
repSetTest:PRIMARY> db.ttlTest.find()
{ "_id" : 1, "createDate" : ISODate("2017-03-10T03:23:01.169Z") }
{ "_id" : 2, "createDate" : ISODate("2017-03-10T03:24:01.169Z") }
{ "_id" : 3, "createDate" : ISODate("2017-03-10T03:25:01.169Z") }
//当指定时间到期后,文档被删除,如下,查询不到任何文档
repSetTest:PRIMARY> db.ttlTest.find()
mongo ttl索引的更多相关文章
- MongoDB自动删除过期数据--TTL索引
前序: 由于公司业务需求,对于3个月前的过期数据需要进行删除动作,以释放空间和方便维护 本来想的是使用crontab写个脚本定时执行,但是看到Mongo本身就有自动删除过期数据的功能,所以还是用一 ...
- mongodb的TTL索引介绍(超时索引)
TTL索引是mongodb新支持的用于延时自动删除记录的一种索引.它仅包含一个字段,该字段值需要是Date()类型,并且不支持复合索引.可以指定某条记录在延时固定时间后自动删除.数据自动超时删除主要用 ...
- MongoDB 学习笔记之 TTL索引,部分索引和文本索引
TTL索引: TTL集合支持mongodb对存储的数据进行失效时间设置,经过指定的时间段后.或在指定的时间点过期,集合自动被mongod清除.这一特性有利于对一些只需要保存一定时间的数据信息进行存储, ...
- MongoDB TTL索引的使用
目录 一.TTL索引介绍 二.TTL索引运行逻辑 三.TTL索引的限制 四.TTL索引的使用场景 1. 指定具体的过期时间属性 2. 插入一个具体的过期时间 3. TTL属性的修改(collMod) ...
- mongo学习-TTL索引 过期数据
在mongo中我们可以设置文档的过期时间,超过时间,文档会自动删除.(2.x版本中 固定结合也支持,但是到了3.x中 固定集合这个索引不好用) 用法: 1.创建一个db:db.createColle ...
- Mongo基础 索引的使用
MongoDB中的索引和其他数据库索引类似,也是使用B-Tree结构.mongodb的索引是在collection级别上的,并且支持在任何列或者集合内的文档的子列中创建索引. 所有的MongoDB集合 ...
- Mongo组合索引优化
包含了等值测试.排序及范围过滤查询的索引建立方法: 1. 等值测试 在索引中加入所有需要做等值测试的字段,任意顺序. 2. 排序字段(多排序字段的升/降序问题 ) 根据查询的顺序有序的向索引中添加字段 ...
- 我叫Mongo,干了「索引探索篇」提升我的效率,值得您拥有
这是mongo第四篇"索引探索",后续会连续更新4篇 mongodb的文章总结上会有一系列的文章,顺序是先学会怎么用,在学会怎么用好,戒急戒躁,循序渐进,跟着我一起来探索交流.通过 ...
- 第28章:MongoDB-索引--过期索引(TTL)
①过期索引(TTL) TTL索引是让文档的某个日期时间满足条件的时候自动删除文档,这是一种特殊的索引,这种索引不是为了提高查询速度的,TTL索引类似于缓存,缓存时间到了就过期了,就要被删除了 ②范例: ...
随机推荐
- Task 7 买书最低价格问题
任务: 书店针对<哈利波特>系列书籍进行促销活动,一共5卷,用编号0.1.2.3.4表示,单独一卷售价8元, 具体折扣如下所示: 本数 折扣 2 5% 3 ...
- 2018软工实践—Beta冲刺(5)
队名 火箭少男100 组长博客 林燊大哥 作业博客 Beta 冲鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调组内工作 协助数据库完善搭建 展示GitHub当日代码/文档签入记 ...
- jquery前端第一讲
1.bootstrap里面的文件是什么意思: bootstrap.cssbootstrap.min.cssbootstrap-responsive.cssbootstrap-responsive.mi ...
- 用CSS3的animation轻松实现背景动画:漂浮的云
背景动画如果用的恰当,会给网页带来意想不到的效果.在过去,我们只能用flash或Javascript来实现.幸运的是,CSS3的流行使得我们完全可以使用它来实现这种效果,不再依赖其它编程技术.一段简单 ...
- TCP源码—epoll源码及测试
一.epoll_create & epoll_create1 SYSCALL_DEFINE1(epoll_create, int, size) sys_epoll_create->sys ...
- sitemesh入门
今天在公司用到了sitemesh这个框架. 网上的资料已经有很多了. 在此就不做具体介绍了, 仅仅做个笔记. sitemesh是一种模板框架,是为了解决页面重复代码而设计的. 设计思想 siteme ...
- java9初探
最近研究了一下java9的新特性,也看完了<Modularity Programming in Java 9>,有一些收获写博客记录一下. 1.java9初探
- Beta阶段——第三篇 Scrum 冲刺博客
i. 提供当天站立式会议照片一张: ii. 每个人的工作 (有work item 的ID) (1) 昨天已完成的工作: 账单与舍费余额数据库关联,删除功能 (2) 今天计划完成的工作: 账单排序显示 ...
- Delphi CreateMutex 防止程序多次运行
windows是个多用户多任务的操作系统,支持多个程序同时运行,如果你的程序不想让用户同时运行一个以上, 那应该怎样做呢? 本文将介绍避免用户同时运行多个程序的例子. 需要用到的函数CreateMut ...
- 删除XML文件中的空格
应要求需要删除xml文件中的空格,制表符等字符.要求双引号和xml的text属性中包含的空格不删除. bool delSpace(QFile &file, QString path) //删除 ...