Mongdb海量数据,查询速度原来越慢,用mongodb的交流一下
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 单条查询还是很快的,现在不用原来的mapreduce,直接查询,速度比原来快了!