在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),但從一般前提來看,優化器會將其解決。出於同樣的原因,您給出的答案實際上沒有進一步優化過程。如果您瞭解代碼的實際工作方式,那麼優化器中就會隱含預測。 –