2012-08-05 66 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