2012-08-05 67 views
2

從書縮放的MongoDB:良好的碎片鍵MongoDB中

一般情況下

我們可以概括這個爲碎片密鑰的公式: {coarseLocality:1,搜索:1}

所以我的問題是,這是正確的嗎?不應該成爲更好的寫作的反對者?

而且從書:

此模式繼續:一切都將永遠被添加到「最後」 塊,這意味着一切都將被添加到一個碎片。這個分片鍵 爲您提供了一個單一的,不可分發的熱點。

所以說我的app總是按照user_id和集合中的最後一個條目進行搜索。

什麼是最好的片鍵我應該有,這樣的:

{_id:1, user_id:1} 

或:

{user_id:1,_id:1} 

回答

6

克里斯蒂娜(作者縮放的MongoDB)寫了有一些例子策略博客文章以遊戲的名義解釋:How to Choose a Shard Key: The Card Game

根據您的應用需求和使用情況,對於choosing a good shard key有很多考慮因素。

訂單{coarseLocality : 1, search : 1}的一般建議是確保您的數據有一些地方可供閱讀。

所以在你的情況下,你很可能想要:{user_id:1,_id:1}

查詢時,這將爲相同的user_id提供一些數據的局部性,理想情況下,您的常見查詢將能夠從單個分片中獲取其數據。

相反的順序可以提供更好的寫分佈(假設_id不喜歡默認ObjectId單調遞增鍵),但一個潛在的缺點是reliability:如果您的讀取查詢數據分散在所有的碎片,你將有如果任何一個分片發生故障,則檢索問題。

所以說我的app總是按照user_id和集合中的最後一個條目進行搜索。

如果普遍採用user_id(且不_id)搜索這也會影響你的片鍵和index optimization的選擇。要找到最後的條目,MongoDB必須進行排序;你會希望在一個碎片上做這樣的事情,而不是從所有碎片和排序中收集數據。如果您的_id碰巧是基於日期的,作爲分片鍵的一部分將是有利的,以便找到最後的條目。

+0

謝謝..我實際上意識到這種情況後2-3小時我發佈這= =)..反正我的情況我認爲我將粗略的生活是「yyyy-mm」像書中的例子,因爲大多數我在同一個查詢中搜索多個user_id,但我總是用最後一個條目進行搜索,所以如果我將coarseLocality設置爲yyyy-mm,那麼我只會搜索和排序一個分片。 – 2012-08-06 16:25:24