请教大神们? node-mongodb-native 模块本地连接mongodb查询有时候耗时800+ ms,数据量30条,何解???
代码如下:
var startTime = new Date().getTime(); client.acquire(function (err, db) { if (err) { log.error(“Connected wrong to server”); } else { var collection = db.collection(table); log.info(“aggregateDocuments data: “, JSON.stringify(condition)); collection.aggregate(condition, function (err, result) { var end = new Date().getTime(); console.error(”===mongo=====>>>>”+(end-startTime)); self.returnResult(err, result, cb); }); } client.release(db); });
condition具体逻辑是什么,如果在聚合架构的检索初期数据量就比较大的话那么后续的工作肯定不会快。而且使用聚合本来就是消耗内存的一项工作,你也没有贴出查询范围以及索引情况,这个问题无解
@haozxuan condition是: [{"$match":{“status”:“1”,“is_del”:“0”,“class_id”:{"$in":[“1”]},“school_id”:“1”,"$or":[{“create_id”:“1”},{“receivers”:{"$in":[“1”]}},{“is_school”:1},{“is_class”:1}]}},{"$project":{“type”:1,“content”:1,“medias”:1,“create_id”:1,“create_name”:1,“create_time”:1,“update_time”:1,“create_head_img”:1,“praisesOrReceipt”:1,“comments”:1}},{"$limit":10},{"$sort":{“create_time”:-1}}] 索引是:create_time. 我就没整明白的是,数据才30条,siege -c 1000 ,有时候10ms都不要就出结果,有时候1000+ms才出结果.机器内存cpu都很富裕.
用了generic-pool?
如果有阿里云建议用它免费送的PTS测试
@wldlzt 用了
@wangbinlml 这复杂度,说实话他消耗1s我都不嫌长,加索引字段并没有起到减少遍历次数的功能,反而是最后排序的时候使用了一次。虽然只有30条,但是每条包含的字段都不简单。
@haozxuan确实有点复杂,有这么个应用场景需要这样复杂列表查询.反正这玩意儿暂时用着,后面得拆分成多步实现,否则并发上来就一个字:死.
@haozxuan 其实一条简单查询也很慢的,siege -c 1000 ,也一样,有时候10ms都不要就出结果,有时候1000+ms才出结果.
condition: [{"$match":{“status”:“1”,“is_del”:“0”}},{"$project":{“type”:1,“content”:1,“medias”:1,“create_id”:1,“create_name”:1,“create_time”:1,“update_time”:1,“create_head_img”:1,“praisesOrReceipt”:1,“comments”:1}},{"$limit":10},{"$sort":{“create_time”:-1}}]
node-mongodb-native有自带连接池,没必要用那个,所以也不清楚generic-poo有无影响,建议再确定下两个时间相减计算执行时间的逻辑是否正确,放在collection.aggregate之前试试