MongoDB 文档存储优化
MongoDB document storage optimization
我们有一个 MongoDB 包含数十万个文档,其中每个文档都有多个字段,包括一个数组,该数组会随着时间的推移而增加(每天一个额外的条目,其中每个条目包含一个整数和一个日期)。
为了优化每日更新文档的速度,为每个文档预留更多磁盘 space 是否有意义,这样每次我们向数组添加条目时都不需要移动文档?
预分配 space 在这种情况下对您帮助不大。由于您的文档迟早会增加到超出填充 space,无论如何都会有文档迁移。但是,如果填充因子较高,则会增加磁盘使用方面的开销,而且可能会增加很多。
您的数据模型有缺陷。对于可能增长到无穷大的字段,您应该为日常事件使用第二个集合,参考基础文档。
{
_id: baseDocId,
…
}
将是您的基础文档,然后
{
_id: dailyEventId,
base: baseDocId,
date: someISODate,
…
}
单个事件的文档。获取已知基地的所有事件仍然很容易
db.events.find({base: baseDocId})
但是添加新事件时文档迁移没有问题,不需要增加填充开销,而且您也超过了 16MB 的文档大小限制。
我们有一个 MongoDB 包含数十万个文档,其中每个文档都有多个字段,包括一个数组,该数组会随着时间的推移而增加(每天一个额外的条目,其中每个条目包含一个整数和一个日期)。
为了优化每日更新文档的速度,为每个文档预留更多磁盘 space 是否有意义,这样每次我们向数组添加条目时都不需要移动文档?
预分配 space 在这种情况下对您帮助不大。由于您的文档迟早会增加到超出填充 space,无论如何都会有文档迁移。但是,如果填充因子较高,则会增加磁盘使用方面的开销,而且可能会增加很多。
您的数据模型有缺陷。对于可能增长到无穷大的字段,您应该为日常事件使用第二个集合,参考基础文档。
{
_id: baseDocId,
…
}
将是您的基础文档,然后
{
_id: dailyEventId,
base: baseDocId,
date: someISODate,
…
}
单个事件的文档。获取已知基地的所有事件仍然很容易
db.events.find({base: baseDocId})
但是添加新事件时文档迁移没有问题,不需要增加填充开销,而且您也超过了 16MB 的文档大小限制。