Mongdb海量数据,查询速度原来越慢,用mongodb的交流一下 - CNode技术社区

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

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月15日T00:10:38Z"),这个有影响?

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

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

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

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

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

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

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

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

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

回到顶部

AltStyle によって変換されたページ (->オリジナル) /