2012-03-07 70 views
7

假設一個假設的文件有3個字段:MongoDB的 - 唯一索引VS複合索引

  1. _id:OBJECTID
  2. EMAILADDRESS:字符串
  3. 帳戶:字符串

現在,給定一個查詢在emailAddress和帳戶上,以下兩個索引中的哪一個將表現得更好:

  1. 上EMAILADDRESS單獨唯一索引(假設它是一個獨特的領域)
  2. 複合指數賬號和EMAILADDRESS

回答

14

在性能上的差異將是小充其量條款。由於您的電子郵件地址是唯一的,所以具有電子郵件字段的任何複合索引都不會比單獨使用電子郵件地址索引更有幫助。原因是您的電子郵件字段已經具有您的收藏夾的最大基數,並且任何進一步的索引字段都不會幫助數據庫更快地過濾記錄,因爲它將始終僅通過電子郵件字段到達正確的文檔。

就內存使用情況而言(這對MongoDB等數據庫非常重要),電子郵件索引本身也小得多。

TL; DR:僅在電子郵件地址上使用索引。

+0

這也是我一直在傾向的方向,空間考慮通常意味着電子郵件索引本身就是正確的決定。這就是爲什麼我已經提高了它。然而,在你的回答中,我並沒有看到一個令人信服的證據,表明在平均情況下,這兩種方案哪一種表現更好。 – 2012-03-07 11:29:50

+2

那應該很容易扣除。如果索引A(僅限電子郵件)與索引B(化合物)完全相同的B樹遍歷,則不存在複合索引可能更快的情況。 – 2012-03-07 11:53:48

3

說到索引,目標是創建具有最高可能基數(或「選擇性」)的單個索引。嘗試編寫每個查詢使用1(複合)索引的查詢。唯一索引具有最大基數。複合具有較少選擇性字段的唯一索引不能進一步增加該最大值。添加更多索引只會減慢find(),update()和remove()查詢的速度。所以要「精益而意味」。

然而,如果您正在使用的帳戶字段排序(),而在電子郵件領域做一個find()方法,那麼你應該使用一個複合索引:

很常見,用來查詢多個鍵和排序 結果。對於這些情況,複合指標是最好的。 http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ

所以想通了!如果您需要通過另一個字段對數據進行排序,那麼通常需要一個複合索引。