在浏览mongodb切分教程时,我遇到了以下断言:
如果在查询中使用shard键,它将点击--少量的碎片,通常只有一个--
另一方面,从我先前对切分的一些基本知识来看,我的印象是,如果查询是在shard键上激发的,mongos路由服务可以唯一地指出目标碎片。我的问题是-在什么情况下,基于切分键的查询有可能击中多个碎片?
发布于 2017-02-12 07:24:52
使用shard键的查询将针对碎片的子集来检索查询的数据,但取决于查询和数据分布,这可能只有一个或多到所有碎片。
借用MongoDB文档中关于碎片键的有用图像:

MongoDB使用shard键自动将数据划分为称为块的切分键值的逻辑范围。默认情况下,每个块表示大约64 is的数据,并且与当前拥有该范围的shard键值的单个碎片关联。块计数是在可用碎片之间保持平衡,并且没有期望相邻的块位于相同的碎片上。
如果您查询属于单个块内的碎片键值(或值范围),则mongos肯定可以针对单个碎片。
假设块范围如上面的图像所示:
// Targeted query to the shard with Chunk 3
db.collection.find( { x: 50 } )
// Targeted query to the shard with Chunk 4
db.collection.find( {x: { $gte: 200} } )如果查询跨越多个块范围,则mongos可以针对包含相关文档的碎片子集:
// Targeted query to the shard(s) with Chunks 3 and 4
db.collection.find( {x: { $gte: 50} } )本例中的两个块要么位于相同的碎片上,要么位于两个不同的碎片上。您可以查看解释结果查询,以查找有关访问哪些碎片的更多信息。
还可以构造一个需要来自所有碎片的数据的查询(例如,基于大量的shard键值):
// Query includes data from all chunk ranges
db.collection.find( {x: { $gte: -100} } )注:以上信息描述了基于范围的切分。MongoDB还支持基于散列的切分键,它(有意)在散列后将相邻的碎片键值分配到不同的块范围。对哈希碎片键的范围查询将包括多个碎片。见:散列与范围切分。
https://stackoverflow.com/questions/42179798
复制相似问题