【问题标题】:MongoDB. How to set up indexes?MongoDB。如何设置索引?
【发布时间】:2014-09-20 14:31:51
【问题描述】:

请帮我处理 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)
}   

【问题讨论】:

  • 您最好提供更多详细信息。例如,你做了哪些索引?哪些字段具有唯一值? ...
  • 添加到示例问题文档中
  • 除了非常奇怪的结构之外,您可能只是read the docs about indexing

标签: mongodb mongodb-query


【解决方案1】:

在创建索引之前,请考虑以下几点:
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
}

【讨论】:

    猜你喜欢
    • 2014-08-20
    • 2021-04-14
    • 2019-02-13
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多