mongos /智能路由

mongos /智能路由

问题描述:

假设集 “COLL” 具有索引mongos /智能路由

{ts : 1, X : 1 , Y : 1} 

Whre TS,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)最后 - 会发生什么W /多重约束范围:

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. 只会打击包含可能符合您的范围标准的文档的碎片。 Mongos能够确定这是因为您查询分片键,从而知道哪些符合条件。对个别碎片的查询是并行执行的。
  2. 与1相同)。 Mongos足够聪明,可以知道哪些块需要这样做。
  3. $或者中的每个子句将被单独评估。如果子句解析为完全相同的查询计划和块范围,则它们将/应该组合在一起。您可以通过在分片环境中对查询运行explain()并检查返回的信息来检查此问题。如果它包含“子句”对象,则表示不是$中的所有子句或可以使用相同的查询执行计划。

这就是理论,但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()和其他监视工具来查看查询在分片环境中的行为方式,以确保其按预期工作。

+0

谢谢,非常有帮助。我最终还是下载了Python脚本(http://github.com/mongodb/mongo-snippets/blob/master/sharding/simple-setup.py),并使用不同的块大小进行工具...总的来说,性能。我们投掷在mongo上的绝大多数时间序列查询将被绑定到单个最小/最大对,所以这对我们来说非常合适。 –