MongoDB 性能:并发的单个集合与多个集合 read/writes

MongoDB Performance: single collection vs multiple collections for concurrent read/writes

我在我的网络服务器上使用本地数据库来同步来自外部 API 的某些数据。本地数据库将用于为 Web 应用程序提供服务。对于访问网络应用程序的每个用户,我正在同步的数据是不同的。由于当用户从网页访问他们的数据时,同步作业会定期但持续地写入数据库,我想知道什么会给我最好的性能。

由于同步作业不断写入数据库,我相信集合在完成之前会被锁定。我认为拥有多个集合在这里会有所帮助,因为锁将锁定在正在写入的特定集合上,而不是每次都锁定在单个集合上。

我的想法对吗?我基本上不希望读取受到限制,因为写入操作会不断锁定一个集合。

MongoDB 中有大量关于锁定粒度和锁定的信息,通常 here

一般来说,写入多个集合,对于 "multiple" 的中小值,并假设所有集合都是预先创建的,可以比使用单个集合更快,代价是例如,如果您必须通过聚合管道执行连接而不是执行单个 collection/index 扫描,查询就会变得笨拙并且可能变慢。

如果您有太多的集合以至于打开了太多的文件以至于数据库或 OS 开始将文件从各自的缓存中逐出,性能将再次开始下降。

创建集合也可能相对较慢,因此如果在负载下发生这种情况可能对性能来说不是很好。

Collection 级别锁定在 MongoDB 中从来都不是问题。在带有 MongoDB 4.x 的 WiredTiger 存储引擎出现之前,有很多情况会导致整个数据库锁定。

如今,使用 WiredTiger 将多线程 and/or 进程写入单个 collection 非常高效。在 MongoDB 中分配 非常 重写入负载的正确方法是 shard 您的 collection。

要测试分片配置与非分片配置,您可以轻松地与 MongoDB Atlas 并行启动这两种配置。