OPTIONS
翻译或纠错本页面

写操作性能

索引

在每次插入、更新及删除操作之后,除了数据本身之外,MongoDB还必须更新与该集合相关的 每一个 索引。因此,一个集合中的每个索引都会对写操作的性能加大一定数量的开销。 [1]

一般说来,索引为 读操作 提供的性能提升相较于插入的惩罚是值得的。然而,为了尽可能地优化写入的性能,在创建新索引及评估现有索引时,一定要谨慎,以保证您的查询确实使用了这些索引。

请查阅 Query Optimization 了解关于索引及查询的信息。此外,您还可以通过查阅 Indexes and 索引策略 了解更多关于索引的信息。

[1]

针对无索引字段的插入和更新操作, sparse indexes 的开销要高于非稀疏索引。此外,对于非稀疏索引而言,不改变记录大小的更新操作占用更少的索引开销。

文档增长

如果一个更新操作使得一个文档超过了目前分配的 记录大小 。MongoDB将会在磁盘上为该文档重新分配足够的连续空间以保存该文档。这些重新分配将会比就地更新操作花费更长时间,尤其是在该集合有索引的情况。如果某集合有索引,MongoDB必须更新所有的索引条目。因此,对于一个拥有许多索引的集合而言,这样的迁移将会影响写的吞吐量。

一些更新操作,例如 $inc 操作,并不会造成文档大小的增加。对这些更新操作,MongoDB可以就地执行这个更新操作。其它的像 $push 这样的更新操作将会改变文档的大小。

就地更新很明显比那些造成文档增长的更新操作更高效。如果可能的话,您可以使用 data models 来最小化文档增长的需求。

请查阅 Storage 了解更多信息。

存储性能

硬件

存储系统的容量给MongoDB写操作的性能带来了一些重要的、物理方面的限制。许多与驱动器存储系统相关的单值因子都会影响写操作的性能,包括:随机存取模式、磁盘缓存、磁盘预加载库文件以及独立磁盘冗余阵列配置等。

对于随机工作负载而言,固态硬盘的性能优于旋转磁盘100倍甚至更多。

请查阅

Production Notes for recommendations regarding additional hardware and configuration options.

日志

MongoDB在一个记录在磁盘上的 日志 上使用 预写式记录 来保证 write operation 的持久性,并且提供崩溃之后的恢复。在数据文件上执行改变之前,MongoDB将改变这个操作写入日志中。

尽管日志提供的持久性保证通常比额外写操作的性能花费更重要,但是您可以从下面日志和性能之间的交互方面进行考虑:

  • 当日志和数据文件位于相同的块设备时,数据文件和日志也会将不得不竞争数量有限的写操作。将日志移动到一个单独的设备有可能能够提高写操作的容量。

  • 如果应用在 write concern 中指定包含 journaledmongod 将会减少日志提交的时间间隔,这样将会提高整体的写入负载。

  • 日志提交的时间间隔是可以通过使用 commitIntervalMs 运行时间选项进行配置的。降低日志提交的时间间隔将会增加写操作的数量,这将限制MongoDB写操作的容量。加大提交之间的时间间隔不仅仅有可能会降低写操作的总数量,还会增加在出现错误时日志不会记录一个写操作的概率。

请查阅 Journaling Mechanics 了解更多关于日志额外的信息。