单个findOne查询的性能异常缓慢(超过60-85ms)。下面的设计是否存在根本性的问题?我应该采取哪些步骤来加快这项操作?
目标(一定范围内的项目快速计数,低于10-20毫秒):
设置
MongoDB数据库
3000个文档,time_axis上的复合升序索引,latency_axis,数字字段
[ { time_axis:1397888153982,latency_axis:5679,number:1},
{ time_axis:1397888156339,latency_axis:89 ,number:2},
...
{ time_axis:1398036817121,latency_axis:122407,number:2999},
{ time_axis:1398036817122,latency_axis:7149560,number:3000} ]
NodeJs
exports.getCount = function (uri, collection_name, min, max, callback) {
var low, high;
var start = now();
MongoClient.connect(uri, function(err, db) {
if(err) {
return callback(err, null);
}
var collection = db.collection(collection_name);
async.parallel([
function findLow(callback){
var query = {time_axis : { $gte : min}};
var projection = { _id: 0, number: 1};
collection.findOne( query, projection, function(err, result) {
low = result.number;
console.log("min query time: "+(now()-start));
callback();
});
},
function findHigh(callback){
var query = {time_axis : { $gte : max}};
var projection = { _id: 0, number: 1};
collection.findOne( query, projection, function(err, result) {
high = result.number;
console.log("max query time: "+(now()-start));
callback();
});
}
],
function calculateCount ( err ){
var count = high - low;
db.close();
console.log("total query time: "+(now()-start));
callback(null, count);
});
});
}
注意:感谢Adio的回答。事实证明,mongodb连接只需要初始化一次并自动处理连接池。 :)
答案 0 :(得分:0)
尝试在NodeJs中使用--prof选项生成分析结果,您可以找到它花费的时间。例如。 node --prof app.js
您将获得包含分析结果的v8.log
文件。解释v8.log
的工具是linux-tick-processor
,可以在v8项目v8/tools/linux-tick-processor
中找到。
获取linux-tick-processor:
git clone https://github.com/v8/v8.git
cd v8
make -j8 ia32.release
export D8_PATH=$PWD/out/ia32.release
export PATH=$PATH:$PWD/tools
linux-tick-processor /path/to/v8.log | vim -
答案 1 :(得分:0)
查看源代码,我发现每次查询MongoDB时都会创建一个新连接。尝试提供已创建的连接,从而重用您创建的连接。来自Java世界我认为你应该创建一些连接池。
您还可以查看此question及其答案。
" You open do MongoClient.connect once when your app boots up and reuse the db object. It's not a singleton connection pool each .connect creates a new connection pool. "