大型数据库的Mongo地理空间索引 - 不使用索引

时间:2015-12-09 16:36:58

标签: mongodb geospatial

我有一个超过150万条+记录的MongoDB - 出于某种原因,即使索引正确,我的基本地理空间查询的性能也很差:

db.regions.find({ 
      loc: {  $near: {     
         $geometry: {         
            type: "Point" ,         
            coordinates: [ 15.8775 , 49.2177 ]      
         },      
         $maxDistance: 1000,      
         $minDistance: 1   
} } }).limit(1).explain();

说明显示该索引未被使用:

{
    "cursor" : "S2NearCursor",
    "isMultiKey" : false,
    "n" : 1,
    "nscannedObjects" : 4102,
    "nscanned" : 4102,
    "nscannedObjectsAllPlans" : 4102,
    "nscannedAllPlans" : 4102,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 2001,
    "nChunkSkips" : 0,
    "millis" : 18252,
    "indexBounds" : {

    },
    "server" : "N/A:27017",
    "filterSet" : false
}

然而,索引肯定存在于2dpshere字段中:

> db.regions.getIndexes();
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "hive.regions"
    },
    {
        "v" : 1,
        "key" : {
            "checkin_id" : 1
        },
        "name" : "checkin_id_1",
        "ns" : "hive.regions"
    },
    {
        "v" : 1,
        "key" : {
            "bid" : 1
        },
        "name" : "bid_1",
        "ns" : "hive.regions"
    },
    {
        "v" : 1,
        "key" : {
            "loc" : "2dsphere"
        },
        "name" : "loc_2dsphere",
        "ns" : "hive.regions",
        "2dsphereIndexVersion" : 2
    }
]

快速查询基本排序:

> db.regions.find().sort({"checkin_id":1}).limit(1).pretty();
{
    "_id" : ObjectId("56645ce6e5bfa89d1f8b4567"),
    "checkin_id" : 51548290,
    "created_at" : ISODate("2013-10-29T04:15:43Z"),
    "loc" : {
        "type" : "Point",
        "coordinates" : [
            -117.236,
            33.1557
        ]
    },
    "suburb" : "",
    "state_district" : "",
    "county" : "United States of America",
    "state" : "California",
    "vid" : 0,
    "user_id" : 133661,
    "bid" : 9288,
    "item_id" : 0
}

我看到这个查询(使用说明),我得到了正确的indexBounds结果:

> db.regions.find().sort({"checkin_id":1}).limit(1).explain();
{
    "cursor" : "BtreeCursor checkin_id_1",
    "isMultiKey" : false,
    "n" : 1,
    "nscannedObjects" : 1,
    "nscanned" : 2,
    "nscannedObjectsAllPlans" : 1,
    "nscannedAllPlans" : 2,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 0,
    "indexBounds" : {
        "checkin_id" : [
            [
                {
                    "$minElement" : 1
                },
                {
                    "$maxElement" : 1
                }
            ]
        ]
    },
    "server" : "XXXX:27017",
    "filterSet" : false
}

我在这里缺少什么?为什么不使用任何索引?

0 个答案:

没有答案