我有以下文件:
{_id: "someid1", "bar": "somevaluebar1"}
{_id: "someid2", "foo": "somevaluefoo2", "bar": "somevaluebar2"}
{_id: "someid3", "foo": "somevaluefoo3", "zoo": "somevaluezoo3"}
{_id: "someid4", "zoo": "somevaluezoo4"}
1。 如果我们通过" foo"最多和" bar"第二,创建复合分片键是否有意义,如 {" foo" :1," bar" :1," _id" :1} ?
2。 "富"或" bar"也可以从文档中遗漏,所以我添加了#34; _id"到复合分片键。这是一个好的决定吗?
3。 如果我通过" bar"?查询将会发生什么?是否会收集所有分片以收集结果?
答案 0 :(得分:0)
在创建分片键时需要了解的是,与常规键(主键或辅助键)相比,它们需要具有不同的属性。通常,分片组数据块包含相似的分片键值(即驻留在特定范围内的值)。因此,一个好的分片键不应该单调增加。
如果是复合分片键,因为它包含" _id"字段对于每个文档都是唯一的。因此,它对于分片键是一个糟糕的选择,因为所有的块都会被转储到一个分片上。这可以通过使用散列键来克服,如下所示,
sh.shardCollection("<your-db>", {{ "foo" : 1, "bar" : 1, "_id" : 1 }:"hashed"})
现在,解决您提出的个别问题。 1.由于您在&#34; foo&#34;上更多地查询您的数据。比起&#34; bar&#34;,制作&#34; foo&#34;作为分片键。如果是,&#34; foo&#34;均匀分布,不需要散列。
您可以编辑&#34; foo&#34;具有一些虚拟值的字段,那么您就不需要广告&#34; _id&#34;在复合分片键中。但是,如果空的数量为&#34; foo&#34;字段很高,您可以使用一系列虚拟值。
如果您只使用&#34; foo&#34;创建分片,则在使用&#34; bar&#34;进行查询时所有的碎片都会被击中以收集结果。
TL;博士。如果&#34; foo&#34;明显高于&#34; bar&#34;基于运营,&#34; foo&#34;然后,foo可以被用作分片键,并且虚拟值可以用来填充缺失的&#34; foo&#34;值。