写操作性能

在本页面

Indexes

集合上的每个索引都会增加写入操作的性能。

对于集合上的每个insertdelete写操作,MongoDB 将从目标集合中的每个索引中插入或删除相应的文档密钥。 update操作可能导致对集合上索引子集的更新,具体取决于受更新影响的键。

Note

如果写操作中涉及的文档包含在索引中,则 MongoDB 仅更新sparsepartial索引。

在使用MMAPv1存储引擎的mongod实例上,更新操作可能导致文档超出其分配的空间。当文档超出其分配的空间时,MMAPv1 会将文档移动到磁盘上的新位置,并且必须更新集合上的每个索引以指向新的文档位置。这些移动操作可能很昂贵,但很少发生。

通常,索引为读取操作提供的性能提升值得进行插入惩罚。但是,为了在可能的情况下优化写入性能,在创建新索引并评估现有索引时要小心,以确保您的查询实际使用这些索引。

有关索引和查询,请参见Query Optimization。有关索引的更多信息,请参见IndexesIndexing Strategies

文档增长和 MMAPv1 存储引擎

某些更新操作可能会增加文档的大小。例如,如果更新将新字段添加到文档中。

对于 MMAPv1 存储引擎,如果更新操作导致文档超过当前分配的record size,则 MongoDB 会将文档重新放置在磁盘上,并具有足够的连续空间来容纳该文档。需要重定位的更新比不需要重定位的更新要花费更长的时间,尤其是在集合具有索引的情况下。如果集合具有索引,则 MongoDB 必须更新所有索引条目。因此,对于具有许多索引的集合,此举将影响写入吞吐量。

在 3.0.0 版中进行了更改:默认情况下,MongoDB 使用2 大小分配的幂为 MMAPv1 存储引擎添加padding automatically2 大小分配的幂确保 MongoDB 分配的文档空间大小为 2 的幂,这有助于确保 MongoDB 可以有效地重用由文档删除或重定位创建的可用空间,并在许多情况下减少重新分配的发生。

尽管2 大小分配的幂可以最大程度地减少重新分配的发生,但是不能消除文档的重新分配。

有关更多信息,请参见MMAPv1 存储引擎

Storage Performance

Hardware

存储系统的功能为 MongoDB 的写操作性能创建了一些重要的物理限制。与驱动器的存储系统相关的许多独特因素都会影响写入性能,包括随机访问模式,磁盘缓存,磁盘预读和 RAID 配置。

对于随机工作负载,固态驱动器(SSD)的性能可以比旋转硬盘(HDD)高 100 倍甚至更多。

See

Production Notes获得有关其他硬件和配置选项的建议。

Journaling

为了在崩溃时提供持久性,MongoDB 使用预先写入日志到磁盘journal上。 MongoDB 首先将内存更 Rewrite 入磁盘日志文件。如果在将更改提交到数据文件之前,MongoDB 应该终止或遇到错误,则 MongoDB 可以使用日记文件将写操作应用于数据文件。

尽管日志提供的耐用性保证通常会超过其他写入操作的性能成本,但请考虑以下日志与性能之间的交互作用:

有关日记的其他信息,请参见Journaling

首页