2

我在这方面有点挣扎,来自我们在用户 ID 上分片的 SQL 环境。我们有多个添加了 user_id 的表,以便我们可以分片。如果一张表中有 100 条记录,所有记录都属于同一个用户,那么所有 100 条记录都会在同一个分片中结束。

所以,我们有我们的第一个 mongo 数据库,我们希望能够在必要时进行分片。有一个用户集合,我们打算按 _id 对其进行分片。那里没问题。但是还有第二个集合,其中可能包含一个用户的数百个文档。我们希望它们进入同一个分片,(不必与用户文档相同,因为它们是单独检索的,但它们确实是由用户分块检索的。)但是看起来,如果我们shard by user_id,已添加到第二个集合中,这还不够,shard key 需要是唯一的,所以每次我们进行查找时,我们都会遍历所有分片。这不是最优的。那么,它是否需要完全独特,例如每个集合只有一个这样的记录?

文档表明我们遇到了问题。我希望我不理解。

4

1 回答 1

5

不,分片键不一定是唯一的(尽管它可以是唯一的)。例如,以下分片键{userID : 1, countryID : 1}对于具有字段的集合绝对有效(请注意,两个元素具有相同的 userID 和 countryID):

{userID : 4, countryID : 5},
{userID : 4, countryID : 9},
{userID : 1, countryID : 5},
{userID : 2, countryID : 3},
{userID : 4, countryID : 5},
{userID : 5, countryID : 4}

据我记得,mongo 不允许您仅在缺少密钥的情况下创建分片密钥(并且有一个关于它的错误)。并且在此之后您也无法更改分片键的值。

但是您甚至可以{a : 5}在所有集合中拥有相同的字段并将其用作分片键(这将是完全愚蠢的,但您可以这样做)。

选择分片密钥时必须小心谨慎,因为事后更改它会很痛苦。所以好东西是太阅读了一段时间如何选择分片键。

于 2013-11-13T05:36:32.030 回答