假设集合“coll”具有索引
{ts : 1, X : 1 , Y : 1}
等等,X和Y的类型为NumberLong。
该集合配置为在ts,X
上进行分片您能帮助我了解以下查询将如何执行吗?
1)无限范围:以下查询将针对那些托管范围ts>的分片。仅限100000000还是全局查询?
db.coll.find({ts : {$gt : 100000000}})
2)有限范围:如果是这样,那么这个 - 这将是目标还是全球? mongos是否足够聪明地解析查询?
db.coll.find({$and : [{ts : {$gt : 100000000}}, {ts : {$lte : 110000000}}]})
3)最后 - 多个有界范围会发生什么:
db.coll.find({$or : [[{$and : [{ts : {$gt : 100000000}}, {ts : {$lte : 110000000}}]}, {$and : [{ts : {$gt : 500000000}}, {ts : {$lte : 510000000}}]}]]})
我无法在http://www.mongodb.org/display/DOCS/Sharding+Introduction上找到对范围查询的任何引用...!
提前致谢!
答案 0 :(得分:2)
这是理论,但mongos查询计划往往有点不一致。例如,使用“ts”分片键和分别保存范围minkey-50和另一个51-maxkey的两个分片中的每一个的一个块,此查询
{$or:[{$and:[{ts:{$gt:90}}, {ts:{$lt:100}}]}, {$and:[{ts:{$gt:91}}, {ts:{$lt:100}}]}]}
将正确解析为第二个块的单个查询。但是这个(注意第二节中的90而不是91)
{$or:[{$and:[{ts:{$gt:90}}, {ts:{$lt:100}}]}, {$and:[{ts:{$gt:90}}, {ts:{$lt:100}}]}]}
实际上会导致对两个分片的查询,因为你基本上要求$或两个完全相同的子句。基本上,尝试使用explain()和其他监视工具来查看查询在分片环境中的行为,以确保它按预期工作。