Mongdb海量数据,查询速度原来越慢,用mongodb的交流一下
发布于 10 年前 作者 lzxue 29992 次浏览 最后一次编辑是 8 年前 来自 问答

10亿条定位数据,按时间和经纬度建立了复合索引,将某区域划分成同等大小的网格,需要求取每个网格,每个小时的定位数据。

划分之后近1W个网格,需要执行1w次查询,速度原来越慢都24小时了还没完成,求问有没有是优化的方法? 代码如下:

	MongoClient.connect(mongodburl, function (err, db) {
	 var collection = db.collection('dingwei');
 	var collection2 = db.collection('hexgridkm');

		var query={ time:{$gt:new Date("2015-04-11 12:00:00"),$lt:new Date("2015-05-13 00:00:00")},

  	  loc : {
       		 $geoWithin : {
            	$geometry : place.geometry
		  }
    }
};
async.eachLimit(features,1,function(place,cb){


      	
  			  query.loc.$geoWithin.$geometry=place.geometry;
    			mapreduce(collection,query,place,function(docs){
     			   collection2.insert(docs, function (err, data) {
           		   cb();

      		  })

 	   })
},function(err){
    console.log("success")
})


});

function mapreduce(collection,query,palace,cb){
   	 var map=function(){
 	   var key=new Date(this.time);
    var month=key.getMonth()+1;
    var day=key.getDate();
    if(month<10)
        month="0"+month;
    if(day<10)
        day="0"+day;
    var id="2015-"+month+"-"+day+" "+key.getHours()+":00:00";
    emit(id,1)

};
var reduce=function(key,values){

    return values.length;
};

    collection.mapReduce(map, reduce, {out : {inline: 1},query:query,sort:{time:1}}, function(err, results) {
    if(err)
        console.log(err);
    else {
     
                palace.properties.points=results;
                palace.gridid=palace.properties.id;
                palace.count=results.length;
                cb(palace);

    }
})

}

12 回复

1w次不应该这么慢 时间为啥不是时间戳?

@hezedu 库里存的是mongdb的时间格式( “time” : ISODate(“2015-04-15T00:10:38Z”),这个有影响?

你这是 mongodb 的通用问题。。。还是 gis 数据的专有需求。。

@alsotang 通用的问题,我只是用了空间索引这个功能

@hezedu 查出来的是聚合的结果,存在一个新表里面

先不用mapreduce 用一般的查询语句查询看看慢不慢

@chemdemo 单次查询速度,还可以

@hezedu 插入是不费时间的,主要是查询慢,reduce只是返回每一小时的的数据量,只返回了长度

10亿条数据建立空间索引?建议你先将格网(四至)的经纬度圈定点的分布,不要将1个点或者多变形直接扔进10亿里进行空间关系检索。

@vczero untitled1.png 单条查询还是很快的,现在不用原来的mapreduce,直接查询,速度比原来快了!

untitled1.png 太费内存了,查询是逐个进行的,有什么可以优化的方法 @vczero @alsotang @chemdemo @hezedu

回到顶部