MongoDB的。如何设置索引?

时间:2014-09-20 14:31:51

标签: mongodb mongodb-query

请帮我处理mongoDB中的索引。

有一个集合,其中有800,000个文档。 有一个非常长的请求。大约5秒钟!

{
   "$or":[
      {
         "performer":"534ba408f9cd0ecb51711673",
         "$or":[
            {
               "performersRole":"534ba30bf9cd0ec151a69522"
            },
            {
               "performersRole":{
                  "$exists":false
               }
            }
         ]
      },
      {
         "performersRole":"534ba30bf9cd0ec151a69522",
         "notShowInToDo":{
            "$ne":true
         }
      }
   ],
   "taskTime":{
      "$gte":1409774400,
      "$lt":1409860799
   },
   "$and":[
      {
         "$or":[
            {
               "department":{
                  "$in":[
                     "5356134ef9cd0e4805672a15",
                     "53561368f9cd0e4b05645f3f",
                     "53a0357ff9cd0e670537c4b7",
                     "53a03594f9cd0e6705389449"
                  ]
               }
            },
            {
               "department":{
                  "$exists":false
               }
            }
         ]
      },
      {
         "$or":[
            {
               "salon":"534f7b3bf9cd0e311e77896f"
            },
            {
               "salon":{
                  "$exists":false
               }
            }
         ]
      }
   ],
   "isDone":{
      "$ne":true
   }
}

要添加哪些索引进行优化?谢谢你的建议!

几乎所有关于此格式的文件:

 {
   "_id": "541da66cf535a4a8569dd0ed",
   "title": "test task",
   "taskTime": NumberLong(1411229292),
   "client": "53f876b2f535a4187f9e1264",
   "salon": "534f7c3cf9cd0e91206dd948",
   "track": "541da66cf535a4a8569dd0ec",
   "department": "53a0357ff9cd0e670537c4b7",
   "type": "invitePBP",
   "performersRole": [
     "534ba30bf9cd0ec151a69522"
  ],
   "notShowInToDo": true,
   "@createTime": NumberLong(1411229292),
   "@updateTime": NumberLong(1411229292)
}   

1 个答案:

答案 0 :(得分:0)

在创建索引之前,请考虑以下几点:
1.尽可能减少查询层次数;
2.如果可能,避免使用$add$or;
3.尽可能避免使用$exists,因为它会访问集合,即使在字段上有索引;
4.根据您想要的顺序设计索引。

假设我已正确理解您的要求,然后我重建查询如下:

var query = {
    "taskTime" : {
        "$gte" : 1409774400,
        "$lt" : 1409860799
    },
    "isDone" : {
        "$ne" : true
    },
    "$and" : [
            {
                "salon" : {
                    "$in" : [ null, "534f7b3bf9cd0e311e77896f" ]
                }
            }, {
                "department" : {
                    "$in" : [ null, 
                              "5356134ef9cd0e4805672a15", 
                              "53561368f9cd0e4b05645f3f",
                              "53a0357ff9cd0e670537c4b7", 
                              "53a03594f9cd0e6705389449" ]
                }
            }],
    "$or" : [ {
        "performer" : "534ba408f9cd0ecb51711673",
        "performersRole" : {
            "$in" : [ null, "534ba30bf9cd0ec151a69522" ]
        }
    }, {
        "performersRole" : "534ba30bf9cd0ec151a69522",
        "notShowInToDo" : {
            "$ne" : true
        }
    } ]
};

小心null

  • 请注意,{"salon" : {"$in" : [ null, "534f7b3bf9cd0e311e77896f" ]}可以完全使用v2.4中的索引{salon:1},但仍会在v2.6中访问该集合,我不知道具体原因但只是猜测null的定义可能已更改(包括undefined类型)。
  • 为避免在v2.6中出现此问题,另一种方法是将实际值初始化为字段salon,而不是什么都不做。

您可以尝试这种方式创建索引,并且您的反馈是适当的,因为我没有真正的数据来进行测试。

db.c.ensureIndex({taskTime:1, isDone:1, salon:1, department:1}, {name:"bigIndex"});

添加我的测试结果--1010,000份文件

var a = {
        "taskTime" : {
            "$gte" : 1410443932781,
            "$lt" :  1412443932781
        },
        "isDone" : {
            "$ne" : true
        },
        "$and" : [
                {
                    "salon" : {
                        "$in" : [ null, "534f7b3bf9cd0e311e77896f", "5420ecdc218ba2fb5353ad5b" ]
                    }
                }, {
                    "department" : {
                        "$in" : [ null, 
                                  "5356134ef9cd0e4805672a15", 
                                  "53561368f9cd0e4b05645f3f",
                                  "53a0357ff9cd0e670537c4b7", "5420ecdc218ba2fb5353ad5d",
                                  "53a03594f9cd0e6705389449" ]
                    }
                }],
        "$or" : [ {
            "performer" : "534ba408f9cd0ecb51711673",
            "performersRole" : {
                "$in" : [ null, "5420ecdc218ba2fb5353ad5e" ]
            }
        }, {
            "performersRole" : "5420ecdc218ba2fb5353ad5e",
            "notShowInToDo" : {
                "$ne" : true
            }
        } ]
    };

db.c.find(a).explain();

{
        "cursor" : "BtreeCursor bigIndex",
        "isMultiKey" : false,
        "n" : 1,
        "nscannedObjects" : 1,
        "nscanned" : 54290,
        "nscannedObjectsAllPlans" : 1,
        "nscannedAllPlans" : 54290,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 425,
        "nChunkSkips" : 0,
        "millis" : 261,
        "indexBounds" : {
                "taskTime" : [
                        [
                                1410443932781,
                                1412443932781
                        ]
                ],
                "isDone" : [
                        [
                                {
                                        "$minElement" : 1
                                },
                                true
                        ],
                        [
                                true,
                                {
                                        "$maxElement" : 1
                                }
                        ]
                ],
                "salon" : [
                        [
                                null,
                                null
                        ],
                        [
                                "534f7b3bf9cd0e311e77896f",
                                "534f7b3bf9cd0e311e77896f"
                        ],
                        [
                                "5420ecdc218ba2fb5353ad5b",
                                "5420ecdc218ba2fb5353ad5b"
                        ]
                ],
                "department" : [
                        [
                                null,
                                null
                        ],
                        [
                                "5356134ef9cd0e4805672a15",
                                "5356134ef9cd0e4805672a15"
                        ],
                        [
                                "53561368f9cd0e4b05645f3f",
                                "53561368f9cd0e4b05645f3f"
                        ],
                        [
                                "53a0357ff9cd0e670537c4b7",
                                "53a0357ff9cd0e670537c4b7"
                        ],
                        [
                                "53a03594f9cd0e6705389449",
                                "53a03594f9cd0e6705389449"
                        ],
                        [
                                "5420ecdc218ba2fb5353ad5d",
                                "5420ecdc218ba2fb5353ad5d"
                        ]
                ]
        },
        "server" : "Mars-PC:27017",
        "filterSet" : false
}