2017-11-25 273 views
1

我有一個集合「的帖子」我索引2個鍵在此集合:第二索引鍵有「COLLSCAN」的階段,在MongoDB中

"has_checked" : Array , 
"author_id" : String 

當我試圖找到「has_checked」它了罰款和模式解釋( 「executionStats」),它讓我看到:

"stage" : "IXSCAN" , 
"totalDocsExamined" : 1 

但是,當我試圖找到 「AUTHOR_ID」 它讓我看到:

"totalDocsExamined" : 36988, 
"stage" : "COLLSCAN", 
    "filter" : { 
     "author_id" : { 
     "$eq" : "597a2f9273519a27769f1b30" 
     } 
    } 

這就是 「db.posts.getIndexes()」 的結果

[ 
    { 
      "v" : 1, 
      "key" : { 
        "_id" : 1 
      }, 
      "name" : "_id_", 
      "ns" : "mydb.posts" 
    }, 
    { 
      "v" : 1, 
      "key" : { 
        "has_checked" : 1, 
        "owner_id" : 1 
      }, 
      "name" : "has_checked_1_author_id_1", 
      "ns" : "mydb.posts" 
    } 

]

爲什麼它不使用AUTHOR_ID作爲索引鍵?

回答

0

蒙戈,因爲它不屬於任何索引前綴

給人一種例子,如果你有這樣的

{ "item": 1, "location": 1, "stock": 1 } 

的指數複合指數具有以下索引前綴不使用AUTHOR_ID查詢:

  • {資料:1}
  • {項:1,位置:1}

對於複合索引,MongoDB可以使用索引來支持對索引前綴的查​​詢。因此,MongoDB中可以使用的查詢索引上的以下字段

  • 的項目領域,
  • 項字段和位置字段,
  • 項字段和位置字段和股票領域。

由於項目字段對應於前綴,所以MongoDB也可以使用索引支持對項目和庫存字段的查詢。但是,索引在支持查詢方面效率不高,因爲索引僅作爲物品和庫存。

你可以按照這個https://docs.mongodb.com/manual/core/index-compound/#prefixes有更多的細節

0

從你貼什麼

[ 
    { 
      "v" : 1, 
      "key" : { 
        "_id" : 1 
      }, 
      "name" : "_id_", 
      "ns" : "mydb.posts" 
    }, 
    { 
      "v" : 1, 
      "key" : { 
        "has_checked" : 1, 
        "owner_id" : 1 
      }, 
      "name" : "has_checked_1_author_id_1", 
      "ns" : "mydb.posts" 
    } 

] 

我們可以看到兩點:

,你必須爲索引默認是_id和不能被丟棄。 (欲瞭解更多信息,請參閱here

您不能刪除_id字段上的默認索引。

而你的第二個索引是has_checked,升序以及owner_id也是按升序排列。

雖然複合索引的名稱是不幸的。 "name" : "has_checked_1_author_id_1" 這只是索引名稱,並不意味着索引也是必需的。它通常如果不總是匹配的關鍵,但因爲我們只是人類,錯誤發生。

只需下次檢查密鑰而不是名稱。名稱應該是,但並不總是代表實際的索引鍵是什麼。

我也建議將其從"has_checked_1_author_id_1"重命名爲"has_checked_1_owner_id_1"。如果您對author_id進行了很多查詢,那麼添加其他索引也是一個好主意。