在分片集合中查询大量数据时,我们通过并行查询分片获益良多。 以下问题仅发生在通过哈希键分片的集合中。
在Mongo 2.4中,可以使用哈希边界进行查询,以获取一个块的所有数据。
我们使用了来自this post的查询。 这是一个范围查询,其哈希值为边界:
db.collection.find(
{ "_id" : { "$gte" : -9219144072535768301,
"$lt" : -9214747938866076750}
}).hint({ "_id" : "hashed"})
同样的查询也适用于2.6,但需要很长时间。
explain()显示它正在使用索引,但扫描的对象是通向高的。
"cursor" : "BtreeCursor _id_hashed",
此外,边界是错误的。
"indexBounds" : {
"_id" : [
[
{
"$minElement" : 1
},
{
"$maxElement" : 1
}
]
]
},
2.4 t0 2.6是否有一些重大变化打破了这个查询? 即使边界被解释为非哈希值,为什么需要这么长时间?
是否有其他方法可以获取一个块或哈希索引范围的所有文档?
mongo internal hadoop connector也有分片集合的问题。
谢谢!
答案 0 :(得分:1)
上面的查询工作在2.4中是不受支持的行为。请参阅SERVER-14557,其中包含类似的投诉以及如何正确执行此查询的说明。重新格式化正确的行为,您的查询变为:
db.collection.find().min({ _id : -9219144072535768301}).max({ _id : -9214747938866076750}).hint({_id : "hashed"})
正如SERVER票证中所报告的,还有一个错误(SERVER-14400)阻止此查询针对单个分片。目前还没有计划在2.6中解决。但是,这应该可以防止您在2.6下看到的表扫描,并允许更有效的检索。