您当前的位置: 首页 >  mongodb

小志的博客

暂无认证

  • 0浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

MongoDB——索引属性之TTL索引(TTL Indexes)

小志的博客 发布时间:2022-05-04 22:48:07 ,浏览量:0

目录
    • 一、MongoDB官网地址
    • 二、TTL索引(TTL Indexes)的概述
      • 2.1、TTL索引(TTL Indexes)的前提条件
      • 2.2、处理历史数据通常的做法
      • 2.3、MongoDB提供的做法
      • 2.4、TTL索引(TTL Indexes)的理解
      • 2.5、创建TTL索引(TTL Indexes)的语法
      • 2.6、修改TTL索引(TTL Indexes)过期时间的语法
    • 三、TTL索引(TTL Indexes)的使用约束
    • 四、创建TTL索引(TTL Indexes)的示例
      • 4.1、数据准备
      • 4.2、创建TTL索引
      • 4.3、查询数据
    • 五、修改TTL索引(TTL Indexes)过期时间的示例
      • 5.1、先删除log_events集合
      • 5.2、数据准备
      • 5.3、创建TTL索引
      • 5.4、修改已创建的TTL索引的过期时间
      • 5.5、再次查看TTL索引的过期时间

一、MongoDB官网地址
  • MongoDB官网地址:https://www.mongodb.com/docs/manual/core/index-single/
二、TTL索引(TTL Indexes)的概述 2.1、TTL索引(TTL Indexes)的前提条件
  • 在一般的应用系统中,并非所有的数据都需要永久存储。例如一些系统事件、用户消息等,这些数据随着时间的推移,其重要程度逐渐降低。更重要的是,存储这些大量的历史数据需要花费较高的成本,因此项目中通常会对过期且不再使用的数据进行老化处理。
2.2、处理历史数据通常的做法
  • 方案一:为每个数据记录一个时间戳,应用侧开启一个定时器,按时间戳定期删除过期的数据。
  • 方案二:数据按日期进行分表,同一天的数据归档到同一张表,同样使用定时器删除过期的表。
2.3、MongoDB提供的做法
  • 对于数据老化,MongoDB提供了一种更加便捷的做法:TTL(Time To Live)索引。
2.4、TTL索引(TTL Indexes)的理解
  • TTL索引需要声明在一个日期类型的字段中,TTL 索引是特殊的单字段索引。MongoDB 可以使用它在一定时间或特定时钟时间后自动从集合中删除文档。
  • 对集合创建TTL索引之后,MongoDB会在周期性运行的后台线程中对该集合进行检查及数据清理工作。除了数据老化功能,TTL索引具有普通索引的功能,同样可以用于加速数据的查询。
  • TTL 索引不保证过期数据会在过期后立即被删除。文档过期和 MongoDB 从数据库中删除文档的时间之间可能存在延迟。删除过期文档的后台任务每 60 秒运行一次。因此,在文档到期和后台任务运行之间的时间段内,文档可能会保留在集合中。
2.5、创建TTL索引(TTL Indexes)的语法
  • 语法

    #创建 TTL 索引,TTL 值为3600秒
    db.collection.createIndex( 
    	{ "fileName": 1 }, 
    	{ expireAfterSeconds: 3600 }
    )
    
2.6、修改TTL索引(TTL Indexes)过期时间的语法
  • TTL索引在创建之后,仍然可以对过期时间进行修改。这需要使用collMod命令对索引的定义进行变更

    db.runCommand({collMod:"collection",index:{keyPattern:
    {fileName:1},expireAfterSeconds:600}})
    
三、TTL索引(TTL Indexes)的使用约束

TTL索引的确可以减少开发的工作量,而且通过数据库自动清理的方式会更加高效、可靠,但是在使用TTL索引时需要注意以下的限制:

  • TTL索引只能支持单个字段,并且必须是非_id字段。
  • TTL索引不能用于固定集合。
  • TTL索引无法保证及时的数据老化,MongoDB会通过后台的TTLMonitor定时器来清理老化数据,默认的间隔时间是1分钟。当然如果在数据库负载过高的情况下,TTL的行为则会进一步受到影响。
  • TTL索引对于数据的清理仅仅使用了remove命令,这种方式并不是很高效。因此TTL Monitor在运行期间对系统CPU、磁盘都会造成一定的压力。相比之下,按日期分表的方式操作会更加高效。
四、创建TTL索引(TTL Indexes)的示例 4.1、数据准备
  • 初始化数据

    db.log_events.insertOne({
     "createdAt": new Date(),
     "logEvent": 2,
     "logMessage": "Success!"
    })
    

    在这里插入图片描述

  • 查询初始化的数据

    db.getCollection('log_events').find({})
    

    在这里插入图片描述

4.2、创建TTL索引
  • 创建TTL索引,TTL 值为20秒

    db.log_events.createIndex({"createdAt": 1}, {expireAfterSeconds:20})
    

    在这里插入图片描述

  • 查看创建的索引

    db.log_events.getIndexes()
    

    在这里插入图片描述

4.3、查询数据
  • 20秒后再次查看数据,数据已被删除

    在这里插入图片描述

五、修改TTL索引(TTL Indexes)过期时间的示例 5.1、先删除log_events集合
  • 先删除log_events集合

    db.log_events.drop()
    

    在这里插入图片描述

5.2、数据准备
  • 初始化数据

    db.log_events.insertOne({
     "createdAt": new Date(),
     "logEvent": 2,
     "logMessage": "Success!"
    })
    

    在这里插入图片描述

5.3、创建TTL索引
  • 创建TTL索引,TTL 值为60秒

    db.log_events.createIndex({"createdAt": 1}, {expireAfterSeconds:60})
    

    在这里插入图片描述

  • 查看创建的索引

    db.log_events.getIndexes()
    

    在这里插入图片描述

5.4、修改已创建的TTL索引的过期时间
  • 修改4.2步骤中的TTL过期时间为600秒

    db.runCommand(
      {
        collMod:"log_events",
        index:{
            keyPattern:{createdAt:1},
            expireAfterSeconds:600
        }
      }
    )
    

    在这里插入图片描述

5.5、再次查看TTL索引的过期时间
  • 查看创建的索引,TTL的值已从60修改为600

    db.log_events.getIndexes()
    

    在这里插入图片描述

关注
打赏
1661269038
查看更多评论
立即登录/注册

微信扫码登录

0.0471s