2014-09-19 19 views
2

複合索引中的排序很重要。但是讀/寫的順序是否重要? mongodb足夠聰明,可以根據可用索引對字段進行重新排序嗎?有序字典(python)是否重要w.r.t複合索引?

代碼是在Python中。我讀過,最好通過使用有序字典:http://api.mongodb.org/python/current/api/bson/son.html

但是在切換有序和無序字典之後,我看不到任何性能差異。在任一選項上運行解釋,表明它評估了不同的索引(allPlans字段),並挑選了其順序與收到查詢的方式不同的索引。

如果通過任何方式證實了這一點,我們會很樂意。

我使用的是mongo 2.6。可能是mongo在他們的新版本中增加了一些優化。

編輯:(追加例題) 對於前:

Index is on {c: 1, a: 1, b: 1} 
Intended query: db.tble.find(some_dict) 

哪一個更好? (in python)

  1. some_dict = {c:「C」,a:「A」,b:「B」}#unordered。
  2. some_dict = bson.son.SON({C: 「C」,一個: 「A」,B: 「B」})

無論作出的任何差別,但它是推薦使用第二,我不知道爲什麼。

+3

字段順序在查詢對象中無關緊要。我認爲它會被視爲一個錯誤,因爲它對查詢的含義沒有影響。這就是你所說的「在讀/寫中排序」的意思嗎? – JohnnyHK 2014-09-20 02:16:43

+0

是的現場秩序。例如:db.table.find({「a」:A,「b」:B}) – shrnkrn 2014-09-20 15:47:52

+0

@JohnnyHK用一個例子編輯我的問題。希望現在更清楚。 – shrnkrn 2014-09-20 16:02:46

回答

0

您在查詢中指定字段的順序,例如

db.collection.find({ "a" : 2, "b" : 4}) 

db.collection.find({ "b" : 2, "a" : 4}) 

不要緊,因爲有兩個查詢之間沒有語義差別。指定複合索引時,字段的順序很重要,例如

db.collection.ensureIndex({ "a" : 1, "b" : 1}) 

db.collection.ensureIndex({ "b" : 1, "a" : 1}) 

因爲一個複合索引只能用於滿足上有序索引關鍵字的前綴查詢。這意味着,在{ "a" : 1, "b" : 1}前者指數能滿足查詢

db.collection.find({ "a" : 33}) 

{ "b" : 1, "a" : 1}不能後者指數。有關更多解釋和示例,請參閱compound index docs

+0

是的,你是對的。在python的mongo api(http://api.mongodb.org/python/current/api/bson/son.html)中,它並不重要,它指出:「可以使用常規字典來代替SON對象,但不是當鍵的順序很重要時。「我認爲它是在談論索引等。密鑰的順序何時重要? – shrnkrn 2014-09-22 17:55:52

+0

這是一個特定於python的東西,因爲python dicts不保持鍵上的任何順序。 – wdberkeley 2014-09-22 18:28:30

+0

是的,那麼當有序的字典很重要時,它仍然不會回答。我想這對於用戶來說很重要,因爲插入/更新數據需要根據應用程序的不同而有所不同。除了我想不出任何其他原因。謝謝您的回答! – shrnkrn 2014-09-23 18:50:28