MongonDB: 为什么短时间内对同一个collection的find操作,耗时越来越长
发布于 5 年前 作者 cocobiz 1950 次浏览 来自 问答

如题,因为对MongoDB的使用经验比较少,今天就遇到一个很奇怪的现象,有500个查询,我分5批,每批100的并发查询同一个collection,发现每次返回的结果耗时是递增,比如第一批有可能是800ms, 其它几批基本就是:2000ms, 3000ms, 4000ms, 5000ms 大概是这种递增的值

Dependencies:

  • mongon native drive: mongodb@3.1.8
  • server: Azure CosmosDB Demo:

// 建立连接
const mongoClient = new MongoClinet(url, {
	poolSize: 50
});
await mongoClient.connect();
const  dbClient = mongoClient.db(dbName);	

// queryConditions 包含500个查询条件的数组
const arr = _.chunk(queryConditions, 100);
// 并发查询
for (const chunk of arr) {
    query(mongoClient, chunk);
}
async function query(client, items) {
	const keys = [];
	items.forEach((item) => {
		  let arr = [];
		  for (const k in item) {
			  arr.push({[k]: item[k]});
		  }	
	   keys.push({'$and': arr});
  });

  const cursor = client.collection('test').find({'$or': keys}, {'_id': 1});
  const tick = Date.now();
  cursor.toArray((err, data) => {
	  console.log('-----------------------------------------', Date.now() - tick);     // 这个时间 每次都是递增的
	  if (err) console.error(err);
	  console.log(data)
  })
  }

谢谢大神指点

1 回复

问题找到了,是理解和使用问题 mongoClient会根据poolSize lazy create connection, 所以如果系统启动的时候connections.lenght < poolSize, mongoClient会根据查询动态的创建connection,一旦创建出足够的coonections(poolSize)就不会再创建,以后的查询就会复用了。

回到顶部