在浏览mongodb分片教程时,我遇到了以下断言:
"如果你在查询中使用分片键,它会点击少量分片,通常只有一个"
另一方面,从我之前的一些基本的分片知识,我的印象是,如果在Shard Key上触发查询,mongos路由服务可以唯一地指出目标分片。我的问题是 - 在什么情况下,基于分片键的查询有可能击中多个分片?
答案 0 :(得分:1)
使用分片键的查询将以分片子集为目标来检索查询的数据,但根据查询和数据分布,这可能只有一个或多个分片。
借用shard keys上的MongoDB文档借用有用的图片:
MongoDB使用分片键自动将数据分区为称为块的分片键值的逻辑范围。默认情况下,每个块表示大约64MB的数据,并且与当前拥有该分片键值范围的单个分片相关联。块计数为balanced across available shards,并且不会期望相邻块位于同一个分片上。
如果查询属于单个块的分片键值(或值范围),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} } )
此示例中的两个块将位于相同的分片或两个不同的分片上。您可以查看explain results查询以查找有关访问了哪些分片的更多信息。
还可以构建一个需要来自所有分片的数据的查询(例如,基于大范围的分片键值):
// Query includes data from all chunk ranges
db.collection.find( {x: { $gte: -100} } )
注意:以上信息描述了基于范围的分片。 MongoDB还支持基于散列的分片键,它将在散列后(有意)将相邻的分片键值分配到不同的块范围。散列分片键上的范围查询应包括多个分片。请参阅:Hashed vs Ranged Sharding。