MongoDB分片集群:$indexStats增量分片判定及分片归属疑问
MongoDB分片索引统计递增问题解惑
题目背景
拥有一个含4个分片的MongoDB集群,products集合按{ name : 1, dateCreated : 1 }分片,4个分片的块范围如下:
s1: { name: MinKey, dateCreated: MinKey} - { name: "e", dateCreated: MinKey} s2: { name: "e", dateCreated: MinKey} - { name: "g", dateCreated: MinKey} s3: { name: "g", dateCreated: MinKey} - { name: "m", dateCreated: MinKey} s4:{ name: "m", dateCreated: MinKey} - { name: MaxKey, dateCreated: MaxKey}
集合现有索引:
{ _id: 1 } { name: 1, dateCreated: 1 } { price : 1 } { category: 1 }
执行查询:
db.products.find( { name : { $in : [ "iphone", "ipad", "apple watch" ] } } )
问题:哪些分片的$indexStats会因该查询递增?
答案:s1和s3
解析提到:查询使用了分片键的前缀,iPhone、iPad属于s3,Apple Watch属于s1,因此是定向查询,会命中这两个分片,且递增的是{name : 1, dateCreated : 1}索引。
用户疑问
如何判定iPhone和iPad属于s3而非s2?
解惑
MongoDB中字符串的比较遵循字典序(lexicographical order),和日常字典的排序逻辑一致,逐个字符按ASCII值对比:
- "apple watch"首字母是
a,小于s1分片的上限"e",因此落在s1的范围(MinKey到"e")内。 - "ipad"和"iphone"的首字母都是
i,s3的范围是"g"到"m",i的ASCII值处在g和m之间,所以这两个字符串属于s3的分片范围。 - s2的范围是
"e"到"g",只有首字母为e或f的字符串才会落在这个区间,i不在此范围内,因此iPhone和iPad不属于s2。
内容的提问来源于stack exchange,提问作者cosmos-1905-14
相关产品推荐
相关产品推荐

