我正在运行一个缓慢的查询/聚合,占用3+秒时间,然后其他查询会被阻塞,直到慢查询完成。
执行慢速查询后,只执行一些与连接池大小相等的快速查询,然后所有进一步的操作都会被阻塞,直到执行慢速查询为止。之后,快速查询将正常执行。
我使用的是MongoDB 2.6.7和mongodb驱动程序1.4.30。
慢速集料管道:
[{"$unwind": "$status_history"},{"$sort": {"_id": -1}},{"$limit": 100}]我正在对一个包含10k文档的集合运行上面的查询,这些文档会在200k文档中展开,然后$sort操作。这大约需要5-10秒。
在此之后,通常在100-500 10,3-10秒内执行的任何简单查询。
发布于 2015-02-10 04:50:36
这就是我从MongoBD支持中得到的:
poolSize:允许您控制并行打开多少tcp连接。此值的默认值为5,但您可以将其设置为任意高。驱动程序将使用循环策略来调度和读取tcp连接。
如果连接忙着运行慢速操作,则可能会阻止后续操作。
有两种可能的工作方式--围绕
增加连接池大小
在运行较长的操作时使用更大的连接池将减少发生这种情况的可能性/频率,如果您无法控制正在运行的查询类型,尽管仍然有可能阻止操作,而且随着更长时间运行操作的到来,这种可能性会增加。随着一个更大的池通过循环,很可能是一个长期运行的op已经完成了连接时,它是从池再次选择。
将可能较慢的操作分散到另一个连接池中。
您可以为较慢的操作创建单独的连接池(即MongoClient.connect()的结果),并离开生产池以满足快速查询。这将确保缓慢/阻塞聚合查询不会冻结用于其他操作的池。当然,较慢的操作很难事先确定,但是如果它们可以是使用排序、大限制、跳过或聚合或映射减少操作的查询。
发布于 2015-02-05 05:41:08
您需要使用适当的索引来优化查询,因为在MongoDB中也存在db的锁定,所以所有查询都会在某个时候被阻塞。请检查这里
在大多数情况下,将你的大扫描分解成多个小扫描和加入结果集也会有所帮助。
此外,如果可能的话,可以使用副本集创建切分,以便分发查询。
https://stackoverflow.com/questions/28336817
复制相似问题