基于分片键查询多个分片的查询

时间:2017-02-11 18:45:20

标签: mongodb sharding

在浏览mongodb分片教程时,我遇到了以下断言:

"如果你在查询中使用分片键,它会点击少量分片,通常只有一个"

另一方面,从我之前的一些基本的分片知识,我的印象是,如果在Shard Key上触发查询,mongos路由服务可以唯一地指出目标分片。我的问题是 - 在什么情况下,基于分片键的查询有可能击中多个分片?

1 个答案:

答案 0 :(得分:1)

使用分片键的查询将以分片子集为目标来检索查询的数据,但根据查询和数据分布,这可能只有一个或多个分片。

借用shard keys上的MongoDB文档借用有用的图片: Shard key example from MongoDB documentation

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