2015-11-05 69 views
1

I haveread將索引放在低基數字段上是毫無意義的。 這會保持爲真爲一個複合索引這樣:MongoDB將低基數字段添加到複合索引?

db.perms.createIndex({"owner": 1, "object_type": 1, "target": 1}); 

隨着查詢,例如:

db.perms.find({"owner": "me", "object_type": "square"}); 
db.perms.find({"owner": "me", "object_type": "circle", "target": "you"}); 

的不同object_type「第會隨時間而增加(量可能不超過10或20最大),但只會從大約2或3開始。

類似地,散列索引值得研究嗎?

UPDATE

ownertarget將大大增加。把它想象成一個文件系統,其中owner將「擁有」一個target(即文件)。但是,與unix系統一樣,文件可能是文件夾,符號鏈接或常規文件(因此是文件類型)。因此,雖然只有3 object_type,但ownertarget組合可能會有數千個條目均勻分佈。

+1

我剛剛發佈了一個包含'cardinality'上的一些材料的答案,可以幫助你。 [Index Cardinality](http://stackoverflow.com/questions/33545339/how-does-the-order-of-compound-indexes-matter-in-mongodb-performance-wise/33546159#33546159) – inspired

+0

此外,你可以不創建具有散列索引字段的複合索引。 https://docs.mongodb.org/manual/core/index-compound/#index-type-compound – inspired

+0

這不是毫無意義,它只是...那麼,小心(與任何數據庫相同)。不要將它們作爲複合樹(索引)的頂層。至於你的索引:你有多少個「目標」值? – Sammaye

回答

1

我可能不能回答你的問題,但給我的仙指數基數:

指數基數:它指的是指數的點數爲MongoDB支持各種不同類型的索引。

  1. Regular - 對於我們放入索引中的每個單鍵,肯定會有一個索引點。另外,如果沒有密鑰,那麼在空條目下將會有一個索引點。相對於索引基數而言,集合中的文檔數量爲1:1。這使索引具有一定的規模。它與文檔的集合大小成正比
  2. 稀疏 - 當文檔缺少被索引的鍵時,它不在索引中,因爲它是空的,並且我們不在索引中保留空值稀疏索引。我們將擁有可能小於或等於文檔數量的索引點。
  3. Multikey - 這是數組值的索引。每個文檔將有多個索引點(用於數組的每個元素)。所以,它會比文件的數量更多。

number of index points

比方說,你更新的關鍵稱爲標籤的文檔和更新使得文檔需要得到磁盤上移動。假設您正在使用MMAPv1存儲引擎。如果文檔中有100個標籤,並且如果標籤數組使用多鍵索引進行索引,則需要在索引中更新100個索引點以適應移動?

相關問題