mongos /智能路由

时间:2011-11-24 17:38:11

标签: mongodb

假设集合“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上找到对范围查询的任何引用...!

提前致谢!

1 个答案:

答案 0 :(得分:2)

  1. 将仅包含那些包含可能符合您的范围标准的文档的分片。 Mongos能够确定这一点,因为您查询了分片键,因此知道哪些符合条件。对invidual分片的查询是并行执行的。
  2. 与1相同。 Mongos足够聪明,知道要为此打出哪些块。
  3. $或每个条款将单独评估。如果子句解析为完全相同的查询计划和块范围,则它们将/应该组合。您可以通过在分片环境中对查询运行explain()来检查这一点,并密切关注返回的信息。如果它包含“子句”对象,则表示您的$中的所有子句都不能使用相同的查询执行计划。
  4. 这是理论,但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()和其他监视工具来查看查询在分片环境中的行为,以确保它按预期工作。