【问题标题】:MongoDB Performance: single collection vs multiple collections for concurrent read/writesMongoDB 性能:用于并发读/写的单个集合与多个集合
【发布时间】:2020-04-30 20:35:48
【问题描述】:
我正在使用我的网络服务器上的本地数据库来同步来自外部 API 的某些数据。本地数据库将用于为 Web 应用程序提供服务。对于将要访问 Web 应用程序的每个用户,我正在同步的数据都是不同的。由于同步作业会在用户从网页访问他们的数据时定期但不断地写入数据库,所以我想知道这里的最佳性能是什么。
由于同步作业不断写入数据库,我相信集合在完成之前会被锁定。我认为拥有多个集合在这里会有所帮助,因为锁定将位于正在写入的特定集合上,而不是每次都在单个集合上。
我的想法在这里正确吗?我基本上不希望读取受到限制,因为写入操作会不断锁定一个集合。
【问题讨论】:
标签:
node.js
mongodb
concurrency
locking
database-performance
【解决方案1】:
在 MongoDB 中有大量关于锁定粒度和锁定的信息 here。
一般来说,写入多个集合,对于“multiple”的中小值,并假设所有集合都是预先创建的,可能比使用单个集合更快,但代价是查询变得尴尬,因为例如,如果您必须通过聚合管道执行连接而不是执行单个集合/索引扫描,则可能会很慢。
如果您的集合太多以至于打开的文件太多以至于数据库或操作系统开始将文件从各自的缓存中逐出,性能将再次开始下降。
创建集合也可能相对较慢,因此如果在负载情况下发生这种情况,对性能可能不是很好。
【解决方案2】:
在 MongoDB 中,集合级锁定从来都不是什么东西。在 WiredTiger 存储引擎与 MongoDB 4.x 一起出现之前,有很多情况下整个数据库都会锁定。
如今,使用 WiredTiger 将多个线程和/或进程写入单个集合非常有效。在 MongoDB 中分配 非常 繁重的写入负载的正确方法是 shard 您的集合。
要测试分片与非分片配置,您可以轻松地与MongoDB Atlas 并行启动这两种配置。