写操作性能
一、索引
在每个插入、更新、删除操作后,MongoDB必须更新与每一个集合中除了数据本身相关联的索引。因此,在集合上的每个索引为写操作的性能增加了额外的开销。[1]
在一般情况下,索引为读操作提供性能提升在插入上的惩罚是值得的。无论如何,为了在可能的情况来优化写性能,创建新的索引时要小心,并评估现有的索引,以确保您的查询实际上使用这些索引。
对于索引和查询,查看索引优化。更多索引的信息,查看索引和索引策略。
[1]对于插入和更新到非索引字段,稀疏索引的开销小于非稀疏索引。此外对于非稀疏索引,更新,不改变记录的大小,索引开销较少。
二、文件增长
如果一个更新操作导致一个文档超过当前分配记录的大小。MongoDB为文档在磁盘上重新配置足够的空间来保存文档。这些重新分配的时间比在立即更新时时间要长,特别是如果集合具有索引。如果集合具有索引,MongoDB必须更新所有索引条目。因此,对于有很多索引的集合,此举将影响写入吞吐量。
一些更新操作,就像$inc操作,不导致增加的文件大小。对于这些更新操作,MongoDB可以申请就地更新。其他更新操作,如$push操作,会改变文档的大小。就地更新比造成文件增长的更新更有显著的成效。如果可能的话,使用数据模型,最大限度地减少了需要的文件增长。
更多信息请参阅存储。
三、存储性能
硬件
对于MongoDB的写操作的性能存储系统的容量造成某些重要的物理限制。许多相关的驱动器的存储系统独特的因素会影响写入性能,包括随机接入模式,磁盘缓存,磁盘预读和RAID配置。
固态硬盘可以通过随机工作负载跑赢旋转HDD硬盘100倍或更多。
查看
生产注意事项关于额外的硬件和配置选项的建议。
日志
MongoDB使用预写日志记录到磁盘上的日志来保证写操作的耐用性,并提供碰撞弹性。申请前更改了数据文件,MongoDB把这个改变操写到日志。
当由日志提交的耐用性保证往往胜过额外的写操作性能开销,考虑下面在日志和性能之间的相互影响:
如果日志和数据文件驻留在同一个块设备上,对于一个数量有限的可用的写操作数据文件和日志可能有竞争。移动日志到一个单独的设备可能会增加用于写操作的能力。
如果应用程序指定写关注,其中包括日志, mongod将减少日志提交之间的持续时间,它可以提高整体的写入负载。
日志提交的持续时间是可配置的,使用用commitIntervalMs运行时选项。减小日志提交之间的周期将增加的写操作的数目,它可以限制MongoDB的写操作能力。增加提交之间的时间量的可能会降低写操作的总数量,但同时也增加了机会,该日志将不会在发生故障的情况下记录一个写操作。
关于日志的更多信息,请参阅日记力学。