我运行慢查询/聚合花了3秒多,然后其他查询被阻止,直到慢查询完成。
执行慢查询后,只执行一些等于连接池大小的快速查询,然后阻止所有进一步的操作,直到执行慢查询。之后快速查询正常执行。
我使用的是MongoDB 2.6.7和mongodb NodeJs驱动程序1.4.30。
慢速聚合管道:
[{"$unwind": "$status_history"},{"$sort": {"_id": -1}},{"$limit": 100}]
我在具有10k文档的集合上运行查询,在展开时会产生200k文档,然后$ sort运行。这大约需要5-10秒。
此后任何简单的查询通常在100-500ms 3-10秒内执行。
答案 0 :(得分:3)
这是我从MongoBD支持中得到的:
poolSize :允许您控制并行打开的tcp连接数。此默认值为5,但您可以根据需要将其设置为高。驱动程序将使用循环策略来分发和读取tcp连接。
如果连接忙于运行慢速操作,则可能会阻止后续操作。
有两种可能的解决方法:
增加连接池大小
如果您无法控制正在运行的查询类型,则在运行较长的操作时使用较大的连接池会降低发生这种情况的可能性/频率,但仍可能阻止操作,并且这种可能性会随着更多操作而增加长时间运行的操作进来了。 通过更大的池来循环访问,在从池中再次选择连接时,很可能已经在连接上完成了长时间运行的操作。
将可能较慢的操作分散到另一个连接池
您可以为较慢的操作创建单独的连接池(即MongoClient.connect()的结果),并使生产池满足快速查询。这将确保缓慢/阻塞聚合查询不会冻结其他操作的池。 较慢的操作当然难以预先确定,但是,例如,如果它们可能是使用sort,大限制,跳过或聚合或映射减少操作的查询。
答案 1 :(得分:0)
您需要使用适当的索引优化查询,因为在MongoDB中还存在db的锁定,因此有时会阻止所有查询。 请检查here
在多个小扫描中分解大扫描并加入结果集在大多数情况下也会有所帮助。
如果可能的话,还可以使用副本集创建分片,以便分发查询