我有一个使用索引的简单查询:
db.data.find({'w.em': 'testquery'}).explain();
这是查询explain
:
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "data",
"indexFilterSet" : false,
"parsedQuery" : {
"w.em" : {
"$eq" : "testquery"
}
},
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"w.em" : 1
},
"indexName" : "w.em_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"w.em" : []
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"w.em" : [
"[\"testquery\", \"testquery\"]"
]
}
}
},
"rejectedPlans" : []
},
"serverInfo" : {
"host" : "******",
"port" : ******,
"version" : "3.4.23",
"gitVersion" : "324017ede1dbb1c9554dd2dceb15f8da3c59d0e8"
},
"ok" : 1.0
}
此处的索引大小:
db.data.totalIndexSize(); // 738562048 ~700MB
它在具有8GB RAM的服务器上运行,因此我猜它有空间可以按照此处的建议在RAM中存储索引:
https://docs.mongodb.com/manual/tutorial/ensure-indexes-fit-ram/
集合约为4GB ...而我之前使用IXSCAN编写的简单查询需要16秒!
如何找出瓶颈?