慢findOne查询性能

时间:2014-07-24 05:02:29

标签: node.js mongodb performance database

单个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连接只需要初始化一次并自动处理连接池。 :)

2 个答案:

答案 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. "