【发布时间】:2018-04-19 10:15:42
【问题描述】:
我正在使用现有的 mongodb 集合。数据如下所示:
{ user_id: 123, post: { id: 123456789, title: "..." } },
{ user_id: 123, post: { id: 123456790, title: "..." } },
{ user_id: 124, post: { id: 123456791, title: "..." } }
我需要对此集合进行分片,但我在选择分片键时遇到了问题。我经常根据用户执行操作(例如从用户 123 获取所有帖子)。我应该根据
创建一个分片键吗{
user_id: 1,
post.id: 1
}
或相同,但散列?
如果它是散列的,我假设范围查询将被广播到所有分片。但是如果它不散列,文档会均匀分布在分片上吗?您可以看到值单调增加。
谢谢,
编辑:我想我犯了一个错误,似乎复合索引不能被散列。来自文档(https://docs.mongodb.com/manual/core/index-compound):
您不能创建具有散列索引类型的复合索引。如果您尝试创建包含散列的复合索引,您将收到错误
我想这意味着这个问题是不明智的,所以我会关闭。
编辑 2:再想一想,这个问题是有效的,但这样表述会更好——我似乎有两个选择:
散列 post.id 字段,它应该是唯一的,如果散列将有助于确保数据在分片之间均匀分布,或者
创建 user_id 和 post.id 的复合键,如上面的代码。这也将保证唯一性,并且应该有助于单个用户的数据局部性。 但它会确保跨分片的数据分布均匀吗?
谢谢
【问题讨论】:
-
您是否对 user_uid 进行基于范围的查询?
-
不,仅针对每个用户(即从用户 123 获取所有帖子),或“其中 user_id IN (1,2,3)”
-
最好的尝试方法是使用您的数据进行测试,使用所有最佳选择的分片键,然后尝试这些查询以检查分散-聚集或单个分片命中:)
-
好的,谢谢。一般来说,在上述场景中,复合分片键有意义吗?例如,如果我使用“user_id”作为分片键,我会保证给定用户的所有帖子都在同一个分片上。但是那我怎么保证唯一性呢?我还是分片新手,我不想选择一个坏的分片键。谢谢