2012-12-27 32 views
19

MongoDB爲_id使用ObjectId類型。將MongoDB中的_id類型更改爲整數不好嗎?

如果我讓_id爲遞增整數,會不會好?

(帶this寶石,如果你有興趣)

+0

這真的取決於。有一個參數是否定的,因爲它是一個唯一的id(自動遞增),但是有一個是肯定的,因爲需要維護id以保持id是唯一的(不得不查詢其他計數器集合)。這就像在插入它們之前必須檢查所有_ids的唯一性,它最終會妨礙插入的速度併產生長時間鎖定。 – Sammaye

+0

嗯,這個簡單的功能在DB中有很多動作? =( –

+0

)當然很多,因爲當然MongoDB沒有服務器端自動遞增ID的意義,你可以在這裏找到它需要做的一個:http://docs.mongodb。org/manual/tutorial/create-an-auto-incrementing-field/infact這就是爲什麼MongoDB不支持這種類型的id服務器端的原因之一 – Sammaye

回答

20

不,它是不壞,實際上建在OjbectId是索引中相當可觀的,所以如果你相信你有更好的東西,那麼你比歡迎更多的改變_id場的默認值什麼。 http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/#auto-increment-counters-collection

多線程ISN」:

但是,這是一個很大的,決定何時從默認移開制定ObjectId,使用如下所示自動遞增_ids尤其是當有一些注意事項由於findAndModify和原子鎖實際上可以處理這個問題,所以這個問題很嚴重,但是之後就會遇到第一個問題。 findAndModify不是最快的功能也不是最輕的,並且在定期使用時會出現顯着的性能下降。

即使沒有findAndModify,您也必須考慮自己這樣做的開銷。對於每個插入您需要做一個額外的查詢。圖像具有唯一的ID,您必須查詢每次插入的唯一性,最終您的插入速率將降至爬行狀態,並且您的鎖會積聚起來。

當然,ObjectId真的很獨特,無需通過在插入之前觸摸數據庫來檢查或制定自己的唯一性,因此它沒有這種開銷。

這就是說,這不是世界上最糟糕的想法,如果你認爲它適合你的方案,然後去爲它,但請記住,如果你不需要自動遞增ID它可能是一個負擔,你。

7

你可以做到這一點,但是你有責任確保該整數是唯一的。

MongoDB不像大多數SQL數據庫那樣支持自動增量字段。當你有一個分佈式或多線程的應用程序有多個進程和/或線程來創建新的數據庫條目時,你必須確保他們使用相同的計數器。否則可能會發生兩個線程嘗試在數據庫中存儲具有相同_id的文檔。

發生這種情況時,其中一個會失敗。這意味着您必須等待數據庫返回成功或錯誤(通過調用GetLastError或將寫入關注點設置爲確認爲),這需要花費更長的時間,而不僅僅是以難以忘懷的方式發送數據。

相關問題