2014-01-19 93 views
2

MongodDB中自動生成ID的大小爲12 Bytes,大整數的大小爲8 bytes。我在運行Ubuntu Server的4臺機器上安裝了mongodb集羣,但我現在只是測試一些東西。只能通過一個服務器來完成插入操作,而這個服務器是一個nodejs服務器,但是可以使用運行全球本地c應用程序的各種機器和nodejs服務器來完成更新和刪除操作。MongoDB自動增量ID

由於我完全控制了插入,使用自動遞增ID不是更好嗎?

  • 在1MB的內存中可以保存87381個12字節的ID和131027個8位的 字節ID。
  • 它是值得的去自動增量ID和 除了保存內存有沒有好處?
  • 性能明智不會比較一個8字節的id比一個12的 字節id,並不會減少大小,如果我做索引?

我怎麼做:

我有這個文件

{id:0 latestId:174845423} 

我很少遞增1呢,我的大部分插件是批量插入,這樣的NodeJS服務器修改的文件被插入一個循環中,給每一個遞增的id,在插入操作結束時,我添加我更新最後一個id值的最新id。

+2

您多久會生成一個新ID?意識到在MongoDB中不存在「自動遞增字段」類型,所以您需要使用如下模式:http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/ – WiredPrairie

+0

@WiredPrairie我的日常操作中有98%是讀取和更新,正如我所說的插入只發生在單個nodejs服務器上,所以我可以創建一個具有id字段的文檔,並在插入操作完成時添加到它中,它們是通常批量插入,所以我可以將id添加到要插入的文檔中,並在插入結束時,通過插入文檔的數量來增加id文檔,因此插入操作得到了協調,並且我可以完全控制它們。 – Kanka

+1

If你可以保證Ids是唯一的,並且節點進程永遠不會重複一個Id,你可以使用它。但是,如果節點進程突然死亡......除非將節點進程之外的最後一個值保存,否則將如何重新生成ID? – WiredPrairie

回答

5

「自動增量」在使用分佈式系統時一直是個問題,因爲它創建了一個瓶頸:每個新的增量都需要讀取以前的數據......就像其他一些並行請求一樣。

一般來說,「自動增加」限制了並行性,特別是在分佈式系統上。

+0

在插入文檔之前,我將在nodejs服務器上執行增量操作,nodejs服務器確實會跟蹤最新的id,所以我不會依賴數據庫來獲取最新的id值,所以這樣我將避免必須讀取以前的數據,在這種情況下,這個配置不會更好,自動生成的ID? – Kanka

+0

這聽起來像你只是將瓶頸從數據庫移動到nodejs服務器。也許,你應該問自己這個瓶頸是否會限制你的問題。如果不是,那麼不要想太多,並且無論如何你都可以繼續你的程序。 – Vincent