mongodb $ nearSphere性能问题与巨大的数据(超过200w +)

时间:2015-04-09 03:23:58

标签: mongodb

mongodb版本是2.6 集合中的总记录超过200w

详情如下  集合表结构如下:

{
"postid":NumberLong(97040),
"accountid":NumberLong(348670),
"location":{
"type":"Point",
    "coordinates":[
        112.56531,
        32.425657
    ]
},
"type":NumberLong(1),
"countspreads":NumberLong(6),
"countavailablespreads":NumberLong(6),
"timestamp":NumberLong(1428131578)
}

集合index2dsphere

{
    "v" : 1,
    "key" : {
        "location" : "2dsphere"
    },
    "name" : "location_2dsphere",
    "ns" : "fly.postspreads",
    "2dsphereIndexVersion" : 2
},

**查询命令**如下

db.example.find({"location":{"$nearSphere":{"$geometry":{"type":"Point","coordinates":[113.547821,22.18648]},"$maxDistance":50000, "$minDistance":0}}}).explain()

结果

{
    "cursor" : "S2NearCursor",
    "isMultiKey" : false,
    "n" : 145255,
    "nscannedObjects" : 1290016,
    "nscanned" : 1290016,
    "nscannedObjectsAllPlans" : 1290016,
    "nscannedAllPlans" : 1290016,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 4087,
    "indexBounds" : {

    },
    "server" : "DB-SH-01:27017",
    "filterSet" : false
}

$maxDistance的值现在太大了,从上面的结果来看,我们会发现该命令扫描超过100w +记录,耗时4087ms。

如果我们将$ maxDistance的值减少到500,则新结果如下:

{
    "cursor" : "S2NearCursor",
    "isMultiKey" : false,
    "n" : 21445,
    "nscannedObjects" : 102965,
    "nscanned" : 102965,
    "nscannedObjectsAllPlans" : 102965,
    "nscannedAllPlans" : 102965,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 634,
    "indexBounds" : {

    },
    "server" : "DB-SH-01:27017",
    "filterSet" : false
}

现在命令扫描超过10w +记录并且花费634ms,查询速度也太慢了。即使我将$maxDistance的值减少到0.0001,扫描的记录也会超过8w +,时间也是600毫秒左右。

查询时间是不可接受的,但我没有找到错误的地方。

0 个答案:

没有答案