前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MongoDB 麻烦专业点,不懂可以问,别这么用行吗 ! --TTL

MongoDB 麻烦专业点,不懂可以问,别这么用行吗 ! --TTL

作者头像
AustinDatabases
发布2025-06-11 13:17:26
发布2025-06-11 13:17:26
9200
代码可运行
举报
文章被收录于专栏:AustinDatabasesAustinDatabases
运行总次数:0
代码可运行

资本与技术的“豪赌”70亿赌资, 押宝 AI 数据底座赛道,谁能赢?

是谁不能说,咱们对事不对人。我就说最近遇到的一个MongoDB的使用案例,看过我这个MongoDB系列的老看客,知道我对MongoDB的热爱。

TTL的索引这个功能是MongoDB,我个人觉得最棒的功能之一,通过TTL索引来自动删除过期的数据,这点在MongoDB使用者的手里那是用的很溜。

但今天要说的是另一个问题,就是把TTL给用到业务里面的事情。这点我非常非常不同意,且我不认为这是一个好的使用方法。

这里我们梳理一下TTLS的基本知识,先给一些不懂的同学,然后咱们往下说。

1 TTL 目前仅仅支持Date类型,但你的日期的表达形式必须是ISODate,也就是必须是BSON的Date类型,因为ISODate是在javascript中的一种的时间表现形式,必须是这样的格式的时间,如ISODate("2024-06-09T10:00:00Z"),如果是文本类型的时间是无法创建TTL索引的。

2 在MongoDB中会有一个后台的线程,每60秒扫描一次所有TTL索引,并删除过期文档。通过将过期的expireAfterSeconds 对比时间的value来判断到底这个document是否应该被删除。

3 这里可以通过ttlMonitorSleepSecs 调整这个参数作为删除数据之间的间隔,但不建议调整的太大,这样会导致一个问题,就是每次删除数据会有更多的数据在触发点上,增加删除时的量。

下面我们做一个小例子来说明TTL 索引的一些使用的命令

代码语言:javascript
代码运行次数:0
运行
复制
use ttl_test_db

db.createCollection("ttl_test_collection")



const bulk = [];

for (let i = 0; i < 100000; i++) {
  bulk.push({
    name: "user_" + i,
    createdAt: new Date(),  // 当前时间,10秒后会被删除
    data: Math.random().toString(36).substring(2)
  });
if (bulk.length === 1000) {
    db.ttl_test_collection.insertMany(bulk);
    bulk.length = 0;
  }
}
//通过程序来观察剩余的文档数
setInterval(() => {
print(new Date(), "Count:", db.ttl_test_collection.countDocuments());
}, 5000)

// 创建一个 TTL 索引:100 秒后自动过期
db.ttl_test_collection.createIndex(
  { createdAt: 1 },
  { expireAfterSeconds: 100 }
)

导入10万数据
导入10万数据

导入10万数据

删除10万数据
删除10万数据

删除10万数据

删除10万数据很快,这里我们还可以调整并查看后台的检测数据的频率

代码语言:javascript
代码运行次数:0
运行
复制
ongo7 [direct: primary] ttl_test_db> db.adminCommand({ getParameter: 1, ttlMonitorSleepSecs: 1 })
{
  ttlMonitorSleepSecs: 60,
  ok: 1,
'$clusterTime': {
    clusterTime: Timestamp({ t: 1749537178, i: 1 }),
    signature: {
      hash: Binary(Buffer.from("f50f9b18a88845808544681a72616d491fc4211e", "hex"), 0),
      keyId: Long("7514181421930381314")
    }
  },
  operationTime: Timestamp({ t: 1749537178, i: 1 })
}
mongo7 [direct: primary] ttl_test_db> 

或者修改这个参数,但这个参数在session中修改后,只能维持到下次MONGODB重启之前。

代码语言:javascript
代码运行次数:0
运行
复制
db.adminCommand({ setParameter: 1, ttlMonitorSleepSecs: 10 })

这样修改就会每10秒来判断一次,方便一些要快速密集删除数据的任务。

这里我们来最后说我为什么说,通过TTL来满足业务删除数据的做法是不合适的

1  TTL删除有延迟,或者不确定性,这点不是我们可控的 2  TTL删除可是不能审计的,且我们无法阻止在特殊情况下 3  TTL是不能进行复杂的数据删除的,没有条件这个思路 4  TTL删除数据中性能的问题,可能会发生 5  部署的隐秘性,以及排查问题的不便利性

所以真正有数据删除需求的应通过程序来完成,而不是通过TTL来完成业务的删除数据的需求,且还要保证业务的正确性。那么TTL到底适合删除什么数据,在什么业务中。

1  日志数据,日志数据的自动清理

2  会话的缓存数据,且不在使用的数据

竹板这么一打,芒果数据库,好用又先进,你可的学会,分布存储架构,很灵活,AI,时序与地理,咱们都能玩得转!

图片
图片
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-06-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档