在MongoDB中可以做的事情数量有限,最终可能是一个超出MongoDB本身的物理问题,可能会导致configsrvs不及时响应或导致结果从碎片太慢了。
但是,您可能可以通过使用覆盖查询来解决一些执行中的问题。既然你实际上在LOG_TYPE
上分割,你将已经有一个索引(在你可以分割它之前需要),不仅如此,而且聚合框架会自动添加projection
,这样做无能为力。
MongoDB可能必须与每个分片进行通信以获得结果,否则称为分散和收集操作。
$group
自己不会使用索引。
这是我的结果在2.4.9:
> db.t.ensureIndex({log_type:1})
> db.t.runCommand("aggregate", {pipeline: [{$group:{_id:'$log_type'}}], explain: true})
{
"serverPipeline" : [
{
"query" : {
},
"projection" : {
"log_type" : 1,
"_id" : 0
},
"cursor" : {
"cursor" : "BasicCursor",
"isMultiKey" : false,
"n" : 1,
"nscannedObjects" : 1,
"nscanned" : 1,
"nscannedObjectsAllPlans" : 1,
"nscannedAllPlans" : 1,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
},
"allPlans" : [
{
"cursor" : "BasicCursor",
"n" : 1,
"nscannedObjects" : 1,
"nscanned" : 1,
"indexBounds" : {
}
}
],
"server" : "ubuntu:27017"
}
},
{
"$group" : {
"_id" : "$log_type"
}
}
],
"ok" : 1
}
这是从2.6结果:
> use gthtg
switched to db gthtg
> db.t.insert({log_type:"fdf"})
WriteResult({ "nInserted" : 1 })
> db.t.ensureIndex({log_type: 1})
{ "numIndexesBefore" : 2, "note" : "all indexes already exist", "ok" : 1 }
> db.t.runCommand("aggregate", {pipeline: [{$group:{_id:'$log_type'}}], explain: true})
{
"stages" : [
{
"$cursor" : {
"query" : {
},
"fields" : {
"log_type" : 1,
"_id" : 0
},
"plan" : {
"cursor" : "BasicCursor",
"isMultiKey" : false,
"scanAndOrder" : false,
"allPlans" : [
{
"cursor" : "BasicCursor",
"isMultiKey" : false,
"scanAndOrder" : false
}
]
}
}
},
{
"$group" : {
"_id" : "$log_type"
}
}
],
"ok" : 1
}
在聚集命令willnot使用索引该集团运营商,也是上述acurrate是表示该youonly有您的收藏三个字段?信息有多大? – Sammaye
由于您事实上汇集了您的集合中的所有文档,因此索引将毫无用处,除非它是生成涵盖查询的索引,但我不确定这是否有帮助。 MongoDB仍然会做分散和收集操作 – Sammaye
@Sammaye这是不正确的。如果这是第一个也是唯一的阶段,那么索引将被选中。看到'explain'输出(实际上来自2.4.8),但从一般前提来看,优化器会将其解决。出于同样的原因,您给出的答案实际上没有进一步优化过程。如果您了解代码的实际工作方式,那么优化器中就会隐含预测。 –