2017-02-28 26 views
0

有一個集合people用以下指標:過濾和排序下列哪些查詢將使用索引?

{"first_name": 1, "address.state": -1, "address.city": -1, "ssn": 1} 

對於兩個過濾&排序, 以下哪些查詢會使用索引? Which of the following queries will use the index?

  1. { "first_name": { $gt: "J" } }).sort({ "address.city": -1 }
  2. { "first_name": "Jessica" }).sort({ "address.state": 1, "address.city": 1 }
  3. { "first_name": "Jessica", "address.state": { $lt: "S"} }).sort({ "address.state": 1 }
  4. {"address.city":"West Cindy"}).sort({ "address.city":-1}
  5. {"address.state":"South Dakota","first_name": "Jessica"}).sort({ "address.city":-1}

我已經通過下面的問題去了

但它只解釋了過濾的索引,我需要使用兩個過濾器以及排序功能的索引。

另外,如何確定索引是否用於兩個篩選器&排序 或未使用?

+0

加上'.explain();' –

+1

【解釋】(https://docs.mongodb.com/manual/reference/explain-results/#executionstats)會告訴你在哪裏指數被使用,但作爲B-Tree指數的tumb的規則,他們將從左到右工作,從索引中的第一項開始。您可以查看關於B-tree索引的官方維基百科(這裏是https://en.wikipedia.org/wiki/B-tree)。同樣對於排序將會影響索引的方向(ASC或DESC) –

+0

@Dan Ionescu,複合索引用於向左(而不是從右到左)。所以複合索引的第一個字段可以直接使用,而不是第二個... – JJussi

回答

1

蒙戈使用來自左即,索引{"first_name": 1, "address.state": -1, "address.city": -1, "ssn": 1}索引可以在下面字段查詢 -

  • { 「first_name的」 被施加於:1, 「address.state」:-1, 「address.city」:-1 「SSN」:1}
  • { 「first_name的」:1, 「address.state」:-1, 「address.city」:-1}
  • { 「first_name的」:1, 「address.state」 :-1}
  • {「first_name」:1}

還應該注意,順序對於複合索引很重要。

回答提出的問題,我知道這是M201課程實驗2.1的任務問題,所以我非常瞭解數據集。我會一個接一個的去選項 -

  1. { "first_name": { $gt: "J" } }).sort({ "address.city": -1 }它不能是選項,因爲排序是在地址城市,所以索引不能亂序使用。
  2. { "first_name": "Jessica" }).sort({ "address.state": 1, "address.city": 1 }它可以是一個選項。爲了確保它,我們需要以下運行查詢 -

    var ex = db.people.explain(); 
    

    ex.find({ 「FIRST_NAME」: 「傑西卡」})排序({ 「address.state」:1, 「address.city」: 1})

上面的查詢返回不具有像「舞臺」的迴應:這告訴我們,那種發生在DB使用指數「排序」。如果我們使用Stage SORT,那麼它會告訴您在RAM中發生了排序,而數據庫無法在使用索引的數據庫中進行排序。

  • { "first_name": "Jessica", "address.state": { $lt: "S"} }).sort({ "address.state": 1 }我也一樣選項2.

    ex.find({ 「如first_name」: 「傑西卡」, 「address.state」:{$ LT:「 S「}})。sort({」address.state「:1}) 上面的輸出沒有任何SORT階段,這表明DB能夠使用索引進行排序。

  • {"address.city":"West Cindy"}).sort({ "address.city":-1}忽略此操作是因爲索引不是從左側開始的。

  • {"address.state":"South Dakota","first_name": "Jessica"}).sort({ "address.city":-1}這與選項2相同。我執行了類似的查詢,但沒有得到任何SORT階段,因此它使用索引進行排序。

  • 使用索引進行過濾很容易識別。如果ex.find(<Your query>)正在給出「階段」:「COLLSCAN」那麼索引不用於過濾。選項2,3,5在ex.find()響應中沒有「stage」:「COLLSCAN」,因此它們使用索引進行過濾。

    這樣我確保所有選項都使用索引進行過濾和排序。

    你也可以爲選項1和4運行ex.find(),你將得到「stage」:「COLLSCAN」或「stage」:「SORT」,它告訴索引沒有被用於過濾或排序。

    謝謝...

    相關問題