美文网首页
MongoDB开发之 TTL索引

MongoDB开发之 TTL索引

作者: 五月笙 | 来源:发表于2021-01-03 19:33 被阅读0次

定义

TTL(Time To Live)索引是一种特殊类型的单字段索引,通过配置过期属性实现对文档的自动过期删除。

运行逻辑

MongoDB会开启一个后台线程读取该TTL索引的值来判断文档是否过期。

  • 后台线程每60秒触发一次删除任务
    如果删除的数据量较大,会存在上一次的删除未完成,而下一次的任务已经开启的情况
  • 对于副本集而言,TTL索引的后台进程只会在primary节点开启
    从节点的数据删除是由主库删除后产生的oplog同步来完成
  • TTL索引除了有expireAfterSeconds属性外,和普通索引一样

限制

  • 只支持对单个字段创建TTL索引
  • _id列不支持TTL索引
  • 固定集合(capped collection)不支持TTL索引
  • 不支持用createIndex() 修改expireAfterSeconds属性
  • 一个列只能创建普通索引或TTL索引
  • 如果一个列已经存在索引,则需要先将该索引drop后才能重建为TTL索引

演示

db.collection.createIndex(keys, options)

添加测试数据:

> for (i = 0; i < 10; i++) {
    db.machineLog.insert({
        "content": "机械日志" + i,
        "createdAt": new Date()
    })
}

添加TTL索引,5分钟后数据失效并删除

> db.machineLog.createIndex({createdAt:1}, {expireAfterSeconds:300})

查看数据:

> db.machineLog.find()
{
    "_id": ObjectId("5ff18eff9d594f01396c9ea7"),
    "content": "机械日志0",
    "createdAt": ISODate("2021-01-03T09:31:43.263Z")
}
{
    "_id": ObjectId("5ff18eff9d594f01396c9ea8"),
    "content": "机械日志1",
    "createdAt": ISODate("2021-01-03T09:31:43.275Z")
}
// ... 隐藏其他数据

5分钟后查看数据:

> db.machineLog.find()

修改

对于TTL索引的expireAfterSeconds的属性,可以用collMod方式进行修改>

重新写入数据:

> for (i = 0; i < 10; i++) {
    db.machineLog.insert({
        "content": "机械日志" + i,
        "createdAt": new Date()
    })
}

创建索引:

> db.machineLog.createIndex({createdAt:1}, {expireAfterSeconds:300})

查看索引:

[
    {
        "v": NumberInt("2"),
        "key": {
            "_id": NumberInt("1")
        },
        "name": "_id_",
        "ns": "machine.machineLog"
    },
    {
        "v": NumberInt("2"),
        "key": {
            "createdAt": 1
        },
        "name": "createdAt_1",
        "ns": "machine.machineLog",
        "expireAfterSeconds": 300
    }
]

修改TTL索引:

> db.runCommand({
    collMod: "machineLog",
    index: {
        keyPattern: {
            createdAt: 1
        },
        expireAfterSeconds: 60
    }
})

重新查看索引信息:

[
    {
        "v": NumberInt("2"),
        "key": {
            "_id": NumberInt("1")
        },
        "name": "_id_",
        "ns": "machine.machineLog"
    },
    {
        "v": NumberInt("2"),
        "key": {
            "createdAt": 1
        },
        "name": "createdAt_1",
        "ns": "machine.machineLog",
        "expireAfterSeconds": 60
    }
]

参考

MongoDB Documentation TTL
MongoDB TTL索引的使用

相关文章

网友评论

      本文标题:MongoDB开发之 TTL索引

      本文链接:https://www.haomeiwen.com/subject/yplpoktx.html