2014-09-20 72 views
-2

請幫我用mongoDB中的索引。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) 
} 
+0

你最好提供更多的細節。例如,你製作了哪些索引?哪些字段有獨特的價值? ... – Wizard 2014-09-20 16:09:47

+0

添加到示例問題文檔 – jeka5555 2014-09-20 16:31:40

+0

除了非常奇怪的構造,你可能只是[閱讀關於索引的文檔](http://docs.mongodb.org/manual/core/indexes/)。 – 2014-09-21 09:56:18

回答

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" ]}可以在指數{salon:1}完全工作在v2.4中,但仍會訪問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 
}