我在这个问题上遇到了一些困难,因为我来自于我们根据用户 ID 进行分片的 SQL 环境。我们有多个表,并添加了 user_id,以便我们可以进行分片。如果一张表中有 100 条记录,全部属于同一用户,那么所有 100 条记录最终都会出现在同一个分片中。
因此,我们有了第一个 mongo 数据库,我们希望能够在必要时对其进行分片。有一个用户集合,我们打算按 _id 对其进行分片。那里没问题。但还有第二个集合,其中可能包含一个用户的数百个文档。我们希望它们进入同一个分片(不必与用户文档相同,因为它们是单独检索的,但它们确实由用户分块检索。)但看起来,如果我们通过 user_id 进行分片,该分片已添加到第二个集合中,这还不够,分片键需要是唯一的,因此每次我们进行查找时,我们都会遍历所有分片。这不是最佳的。那么,它是否需要完全唯一,例如每个集合只有一个这样的记录?
文档表明我们遇到了问题。我希望我没有理解。
不,分片键不一定是唯一的(尽管可以是)。例如,以下分片键{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}
Run Code Online (Sandbox Code Playgroud)
据我记得,mongo 不允许您仅在丢失的键上创建分片键(并且有一个关于它的错误)。并且此后您无法更改分片键的值。
但是您甚至可以在所有集合中拥有相同的字段{a : 5}并将其作为分片键(这将是完全愚蠢的,但您可以这样做)。
选择分片密钥时必须小心,因为事后更改它会非常痛苦。因此,好的事情是花一些时间阅读如何选择分片键。
| 归档时间: |
|
| 查看次数: |
2565 次 |
| 最近记录: |