Mongodb自动删除过期的数据——TTL索引

使用spring-data-mongodb 2.0.9中的

Document document =  new Document();
document.append("createTime",1);
IndexOptions indexOptions = new IndexOptions();
indexOptions.expireAfter(300L,TimeUnit.SECONDS);
this.mongoTemplate.getCollection("test").createIndex(document,indexOptions);

createTime是时间字段

 

使用spring-data-mongodb 1.7.0中的

BasicDBObject bson = new BasicDBObject();
            bson.append("createTime",1);
BasicDBObject options = new BasicDBObject();
options.append("expireAfterSeconds",7200);
            this.mongoTemplate.getCollection("test").createIndex(bson,options);

 

 

### MongoDB 占用大量空间的原因 MongoDB 数据库可能会占用较多磁盘空间,主要原因如下: - **预分配文件**:为了提高性能并减少碎片化,MongoDB 预先分配数据文件。这些文件即使未完全填充也会占据一定量的空间[^1]。 - **稀疏索引和多列索引**:当创建多个单列索引或复杂组合的复合索引时(每条记录都会被索引),会增加额外开销。特别是对于大表来说,过多的索引可能导致显著增长的数据体积[^2]。 - **冗余备份机制**:如副本集功能会在不同节点间同步相同的数据副本;另外还有日志文件用于恢复目的等,都增加了实际使用的存储需求。 - **文档结构松散**:由于 BSON 格式的灵活性允许嵌套对象及数组的存在形式保存于单一 document 内部,这使得某些情况下同样信息量下所占字节数更多一些。 ### 存储优化的方法 针对上述原因可采取相应措施来降低 MongoDB 对硬盘资源的需求: #### 启用压缩选项 WiredTiger 是默认存储引擎支持两种类型的内置压缩——块级 (block) 和前缀 (prefix),前者适用于整个页面而后者仅限键名部分。启用此特性能够有效减小整体大小约 70% 左右。 ```javascript // 创建带有压缩设置的新集合 db.createCollection("mycollection", { storageEngine: { wiredTiger: { configString: "block_compressor=zlib,prefix_compression=true" } } }) ``` #### 定期执行紧凑命令 随着频繁写入/修改操作的发生不可避免会产生内部碎片现象,即已释放但尚未回收利用的小块区域累积起来浪费了不少地方。此时可以通过运行 `compact` 命令整理现有 collection 结构从而腾出可用连续区间供后续使用。 ```shell db.runCommand({ compact: 'mycollection' }) ``` #### 调整索引策略 合理规划所需建立哪些字段上的 index 可以避免不必要的重复劳动同时也利于查询效率提升。遵循最佳实践原则只保留真正必要的那些项即可满足业务逻辑要求而不至于过分臃肿。 #### 清理过期数据 设定 TTL (Time To Live)自动移除不再需要的历史版本或是临时性质的内容有助于维持健康的工作负载水平防止无谓膨胀趋势加剧。 ```javascript // 设置 TTL 索引删除超过一天的日志条目 db.logs.createIndex( { "createdAt": 1 }, { expireAfterSeconds: 86400 } ) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值