MongoDB 索引在更新时增长

问题描述

我们使用的是 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,"ttl_-1": 90112
    },"storageSize": 65536,"totalIndexSize": 106496
  }
]

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

解决方法

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

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

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

,

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