首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mongos /智能路由

mongos /智能路由
EN

Stack Overflow用户
提问于 2011-11-25 01:38:11
回答 1查看 216关注 0票数 3

假设集合"coll“有一个索引

代码语言:javascript
复制
{ts : 1, X : 1 , Y : 1}

其中,T、X和Y是NumberLong类型。

该集合被配置为在ts,X上进行分片

您能帮助我了解以下查询将如何执行吗?

1)无界范围:以下查询是否只针对托管范围ts > 100000000的分片,还是全局查询?

代码语言:javascript
复制
db.coll.find({ts : {$gt : 100000000}}) 

2)有界范围:如果是这样的话,这个呢-这是有针对性的还是全局的?mongos是否足够聪明,能够解析出查询?

代码语言:javascript
复制
db.coll.find({$and : [{ts : {$gt : 100000000}}, {ts : {$lte : 110000000}}]})

3)最后--多个有界范围会发生什么:

代码语言:javascript
复制
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上找不到任何范围查询的引用...!

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-25 19:03:09

  1. 将只命中那些包含可能符合您的范围标准的文档的分片。Mongos能够确定这一点,因为您对分片键的查询知道哪些是合格的。对单个分片的查询是并行执行的,
  2. 同1)。
  3. $or中的每个子句都会被单独评估。如果子句解析到完全相同的查询计划和块范围,它们将/应该组合在一起。您可以通过在分片环境中对查询运行explain()来检查这一点,并密切关注返回的信息。如果它包含“子句”对象,这意味着不是$or中的所有子句都可以使用相同的查询执行计划。

这是理论上的,但mongos查询计划往往有一点不一致。例如,如果有一个"ts“分片键,并且两个分片中的一个分片分别包含范围minkey-50和另一个51-maxkey,则此查询

代码语言:javascript
复制
{$or:[{$and:[{ts:{$gt:90}}, {ts:{$lt:100}}]}, {$and:[{ts:{$gt:91}}, {ts:{$lt:100}}]}]}

将正确地解析为对第二个块的单个查询。但这一条(注意第二个子句中的90而不是91 )

代码语言:javascript
复制
{$or:[{$and:[{ts:{$gt:90}}, {ts:{$lt:100}}]}, {$and:[{ts:{$gt:90}}, {ts:{$lt:100}}]}]}

实际上会导致对两个分片的查询,这没有什么意义,因为您基本上是要求它对两个完全相同的子句执行$or操作。基本上,尝试使用explain()和其他监视工具来查看查询在分片环境中的行为,以确保它按预期工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8260843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档