2013-07-11 162 views
1

我有一個用於餐廳的mongo db集合。 例如 {_id:uniquemongoid, 排名:3, 城市: '柏林' }mongodb的索引

  1. 餐廳是由城市上市,並下令按職級(整數) - 我應該在城市排名上創建索引,或城市/等級組合? (我按城市查詢並按排名排序)

  2. 此外,還有幾個布爾值域, {hasParking:true,familyFriendly:true} - 我應該創建索引來加速查詢這些過濾器嗎?複合指數?對我而言,我不清楚是否應該創建複合索引,因爲查詢只能有一個布爾集或更多的布爾值集。

+0

這一切都取決於你有多少數據和你的查詢是什麼。 – Thilo

+0

請注意,您可以使用光標的['explain()'方法](http://docs.mongodb.org/manual/reference/method/cursor.explain/)來檢查用於完成查詢的索引。因此,當您不確定給定索引是否有助於特定查詢時,您可以嘗試一下並檢查。 – Philipp

+0

我的同事就此進行了一次演講:http://www.youtube.com/watch?v = AVNjqgf7zNw他使用mysql作爲示例,但適用相同的原則。也許它會幫助你設計你的索引。 – leif

回答

1

1)創建索引{餐廳:1,等級:1}這將爲您的目的。

你會避免2個指標

2)創建下列格式的文檔,你可以查詢任何不想要的字段。

{ 
    info: [{hasParking:true}, {familyFriendly:true}], 
    _id: 
    rank: 
    city: 
} 
db.restaurants.ensureIndex({info : 1}); 
db.restaurants.find({ info :{ hasParking:true}}) 
  • 注意的MongoDB不使用兩個索引相同的查詢(除$或查詢)。因此,在(2)的情況下,如果您想在(1)查詢中添加添加過濾器,那麼這個(2)選項將不起作用。我不確定你的(2)要求,所以發佈這個解決方案。
+0

查詢將有城市,排名,布爾值,我應該創建一個索引與他們所有?我只有城市有更多的疑問,我應該創建2個索引? – LukeSolar

+0

因爲索引大小很大,所以我不會推薦你使用'{city:1,rank:-1,info:1}'。另外我懷疑這個索引是否可以有效地用於獲取排序結果數據(在'explain()'中檢查'scanAndOrder')。關於第二個查詢,如果我理解正確,它將不起作用,因爲mongo永遠不會對單個查詢使用兩個索引,即'{info:1}'和'{city:1,rank:-1}' 如果你沒事的話與指數大小,你可以用第一種方法。 –

+0

我有大約10K家餐館,我認爲現在我會用第一種方法。但由於我們經常更新(排名),這可能會成爲一個問題(除了索引大小),對嗎? – LukeSolar

3

確定是否需要索引的最好方法是用「explain()」進行基準測試。

至於你的建議的指標:

  1. 您需要的城市/等級的複合指數。 MongoDB中的索引只能用於從左到右(此刻),因此在「城市」上進行等式搜索,然後按「排名」對結果進行排序,這意味着{ city: 1, rank: -1 }索引效果最好。

  2. 布爾型字段上的索引通常不是很有用,因爲平均而言,MongoDB仍然需要訪問一半的文檔。在按城市進行選擇後(並希望有一個限制!)爲hasParking等做一個額外的過濾器將而不是使MongoDB同時使用city/rank和hasParking索引。 MongoDB只能爲每個查詢使用一個索引。

+0

2)您是否同意Abhishek Kumar創建一個包含所有布爾值的字段並創建一個索引? – LukeSolar

+0

不,因爲索引元素的數量仍然非常低。 – Derick