3

我一直在阅读,使用 ObjectId 作为唯一键可以使分片更容易,但我还没有看到关于为什么会这样的相对详细的解释。有人可以对此有所了解吗?

我问的原因是我想使用一个英文字符串(显然是唯一的)作为唯一键,但想确保它以后不会束缚我的手。

4

5 回答 5

4

我最近刚刚开始熟悉 mongoDB,所以对此持保留态度,但我怀疑使用 ObjectId 而不是您自己的键值时分片可能更有效,因为 ObjectId 的一部分会指出哪个创建文档的机器或分片。mongo 文档中此页面的底部解释了 ObjectId 的每个部分的含义。

于 2010-12-05T07:49:32.097 回答
3

我在 Mongo 用户列表上问了这个问题,基本上得到的答复是生成自己的 _id 值是可以的,并且不会使分片变得更加困难。对我来说,有时需要在 _id 上使用数值,就像我要在 url 中使用它们一样,所以我在某些集合中生成自己的 _id。

于 2010-12-05T18:20:36.173 回答
0

ObjectId 被设计为全球唯一。因此,当用作主键并且没有主键值的情况下将新记录附加到数据集时,每个分片都可以生成一个新的 objectid 而不必担心与其他分片发生冲突。这在某种程度上简化了每个人的生活:)

于 2012-08-03T21:41:41.013 回答
0

分片键不必是唯一的。我们不能断定基于对象 id 对集合进行分片总是有效的。

于 2012-09-03T17:28:26.290 回答
0

实际上,对于分片键,ObjectID 可能是一个糟糕的选择。

从文档(http://docs.mongodb.org/manual/core/sharded-cluster-internals/ “写入缩放”部分):

“[T] [an ObjectID] 的最高有效位表示时间戳,这意味着它们以规则且可预测的模式递增。[因此] 所有插入操作都将数据存储到单个块中,因此,单个分片。因此,这个分片的写入容量将定义集群的有效写入容量。”

换句话说,因为每个 OID 的排序都比在它之前创建的那个“大”,所以一个由 OID 键入的插入将落在同一台机器上,而这台机器的写入 I/O 容量将是总 I/整个集群的 O。(这不仅适用于 OID,而且适用于任何可预测的键——时间戳、自动递增数字等)

相反,如果您选择一个随机字符串作为您的分片键,写入将倾向于均匀分布在集群上,您的吞吐量将是整个集群的总 I/O。

(编辑完成:使用 OID 分片键,当新记录落在“最右边”的分片上时,平衡器会处理将它们移动到其他地方,因此它们最终会在其他机器上结束。但这并不能解决 I/哦,问题;它实际上使情况变得更糟。)

于 2013-03-06T01:25:39.590 回答