2015-05-07 50 views
1

我们正在首次构建一个使用MongoDB的新系统。我们的主要文档集合之一包含的文档可以在几百字节的大小范围内,一直到接近16MB的文档限制。MongoDB文档的性能是否更改UPDATE取决于文档大小?

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

我们正在权衡两种选择:

  1. 存储读取的计数为正数
  2. 存储读取的计数的单独收集文档的一部分

第一具有价值,因为我们可以将计数和数据存入数据库。

使这个有关的部分是,似乎文档大小可能会影响写入性能。但是,我没有发现任何提及的情况。我们的猜测是,即使我们正在更新单个字段,整个文档也不得不被反序列化,更新,序列化并写回表格。如果文件大小差别很大,那么表现似乎会跟随。此外,该集合将被编入索引,而MongoDB文档说每次更新都需要更新集合上的所有索引。这些都会增加潜在的性能问题。

如果是这样,那么我们将与第二个选项一起做两个数据库命中。

回答

2

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

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

+0

你知道这个参考文档吗? – GaTechThomas

1

为了解决您的两个问题,更新文档不取决于您正在更新的文档的大小*。因此,如果您有两个文件:一个文件包含200个字段,重量为6Mb,另一个包含3个字段,重量为0.4Kb,您需要更新两个文件的两个字段,两者大致相同。

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

关于您的索引问题。索引不取决于文档大小。这取决于您正在索引的字段数量和字段的大小。例如,对于“非常非常长的文本将会更长”的字段的索引,然后是具有“短文本”的字段。并且数组[1,2,...,500]的索引大小将会比[1,2]更长。