2015-05-09 66 views
0

我有一個非常簡單的Mongo數據庫,用於個人nodejs項目。這基本上只是註冊用戶的記錄。選擇正確的數據庫索引類型

我最重要的領域是字母數字字符串(姑且稱之爲user_id說明並假定它不能只是數字),約15至20個字符。

現在最重要的操作是檢查用戶是否存在或不存在。我這樣做通過查詢db.collection.find("user_id": "testuser-123")

如果沒有記錄返回,我保存用戶以及其他一些不重要的數據,如名字,最後和註冊日期。

現在我當然希望做user_id的索引。 我閱讀official MongoDB Manual上的索引教程。

首先我試着設置一個text index,因爲我認爲這將符合字母 - 數字領域。我也嘗試設置language:none。但事實證明,我的查詢返回約12毫秒而不是6毫秒沒有索引。

然後我試圖只設置一個有序索引一樣{user_id: 1},但我還沒有看到任何差別(這是隻工作了數值?)。

誰能推薦我索引的最佳類型這種情況下或最快的查詢來檢查用戶是否存在?或者,也許是MongoDB不是最好的匹配呢?

回答

1

一些雜感第一:

  • 一個文本指數是用來幫助full text search。考慮到你的描述,這裏並不需要這樣做,因爲如果我理解得很好,你需要使用整個字段的匹配確切的
  • 沒有任何索引,MongoDB將使用線性搜索。使用big O notation,這是一個O(n)操作。使用(有序)索引,搜索在O(log(n))中執行。這意味着,當您擁有多個文檔時,索引將顯着加快查詢速度。但是如果你有少量的文件,你不需要改進。 In that case, O(n) can even be worst than O(log(n))。如果優化器估計它不會提供足夠的好處,某些數據庫管理系統甚至不會使用該索引。不過,我不知道MongoDB是否會這樣做。

鑑於您的用例,我認爲正確的索引是unique index。這是一個有序索引,可防止插入兩個相同的文檔。

在您的應用程序,插入之前不要測試。在實際應用中,當併發插入時,這可能導致競爭狀態。如果您使用唯一索引,只需嘗試即可插入 - 並準備妥善處理由重複鍵導致的錯誤。

+0

感謝您的回答和解釋。我甚至沒有想過只是想插入,但它是有道理的。 –

相關問題