MongoDB文档UPDATE的性能变化是否取决于文档大小?

时间:2015-05-07 00:40:27

标签: mongodb

我们是第一次使用MongoDB构建一个新系统。我们的一个主要文档集合包含的文档可以是几百字节的任何大小,一直到16MB的文档限制。

我们需要跟踪文档被读取的次数并限制读取次数。

我们正在权衡两个选择:

  1. 将读取计数存储为正在计算的文档的一部分
  2. 将读取计数存储在单独的集合中
  3. 第一个有价值,因为我们可以将计数和数据一次点击到数据库中。

    令人担忧的部分是文档大小似乎会影响写入性能。但是,我没有找到任何关于这种情况的提法。我们的猜测是,即使我们更新单个字段,整个文档也必须反序列化,更新,序列化并写回表中。如果文档大小变化很大,那么性能似乎也会随之而来。此外,该集合将被编入索引,MongoDB文档说每次更新都要求更新集合上的所有索引。这些都加剧了潜在的性能问题。

    如果是这样,那么我们将使用第二个选项并进行两次数据库命中。

2 个答案:

答案 0 :(得分:2)

如果您使用“原子更新”操作符,并且您正在更新的字段的大小不会更改,则可以在不触及文档其余部分的情况下执行更新。例如,这适用于$inc

关于索引,如果您在此处更新的字段上没有索引,则不必更新它们。

答案 1 :(得分:1)

解决您的两个问题,文档更新不取决于您要更新的文档的大小*。因此,如果你有两个文件:一个有200个字段,重量为6Mb,另一个有3个字段,重量为0.4Kb,你需要为两个文件更新2个字段,这两个文件大约需要相同的时间。

我在那里添加了一个星星,因为如果您要更新文档并且文档变得更大,那么原始版本可能会document will be moved(如果没有足够的空间来容纳新文档)。在这种情况下,文档的大小会增加一些惩罚(可以使用padding来缓解)。正如Thilio所说,原子更新永远不会导致文件移动。

关于您的索引问题。索引不依赖于文档大小。它取决于您要编制索引的字段数和字段大小。例如,具有“非常长的文本将更长”的字段的索引然后是具有“短文本”的字段。并且数组[1,2,...,500]的索引大小将比[1,2]更长。