【问题标题】:MongoDB index grows on updateMongoDB 索引在更新时增长
【发布时间】:2021-06-19 03:04:24
【问题描述】:

我们正在使用 AWS DocumentDB v3.6.0。 我们想使用 MongoDB TTL 索引功能在一段时间后删除项目。项目经常更新,直到发生特殊事件。因此,我们需要经常更新ttl 字段。

db.test.insertOne({_id: "12345",ttl: new Date()})
db.test.createIndex({ttl:-1},{expireAfterSeconds: 3600})

db.stats() 产生以下预期结果:

[
  {
    "avgObjSize": 51,
    "capped": false,
    "count": 1,
    "indexSizes": {
      "_id_": 16384,
      "ttl_-1": 16384
    },
    "nindexes": 2,
    "ns": "db.test",
    "ok": 1,
    "size": 51,
    "storageSize": 16384,
    "totalIndexSize": 32768
  }
]

但是,如果我们更新项目的 ttl 时间戳,ttl_-1 索引会继续增长。

for (let i = 1; i < 1000; i++) {
    db.test.updateOne({ _id: "12345" }, { $set: { ttl: new Date() } });

}

db.stats() 现在产生:

[
  {
    "avgObjSize": 51,
    "capped": false,
    "count": 1,
    "indexSizes": {
      "_id_": 16384,
      "ttl_-1": 90112
    },
    "nindexes": 2,
    "ns": "db.test",
    "ok": 1,
    "size": 51,
    "storageSize": 65536,
    "totalIndexSize": 106496
  }
]

如您所见,ttl_-1 索引大于_id_ 索引,尽管我们仍然只有一项。为什么?

【问题讨论】:

    标签: mongodb indexing ttl aws-documentdb


    【解决方案1】:

    就地数据覆盖存在各种问题。例如,如果您执行此类写入并断电,不仅新数据会丢失,而且您最终还会破坏数据库中已经存在的数据。

    因此,任何写入都会分配新的存储空间也就不足为奇了。

    1000 次写入(90 KB 的数据?)不足以断定索引正在无限增长。尝试 100 万个,或者需要多少个才能获得上述索引,例如 64 MB。

    【讨论】:

    • 是的,这个例子只是为了表明它在成长。我们已经在生产中使用了这个索引,有 50m 行。 _id_ 索引为 4GB,ttl_-1 索引为 22GB。
    【解决方案2】:

    您是否尝试过删除并重新创建索引?在您的示例中, _id_ 索引仅插入(从不更新)并且不会经历 ttl_-1 索引所做的流失。在您的简单示例以及完整大小的 DocumentDB 数据库中查看之前和之后会很有趣。

    【讨论】:

    • 是的,我们试过了。重新创建的索引确实比以前更小(我们也使用生产数据库的副本来做到这一点,所以 50m+ 行)。但是,该索引随后再次增长。
    猜你喜欢
    • 2016-02-28
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 2019-01-22
    相关资源
    最近更新 更多