索引:类似于书籍的目录,在索引中找到条目以后,就可以直接跳转到目标文档的位置,这能使查找速度提高几个数量级。不使用索引的查询称为全表扫描,即服务器必须查找完一整本书才能找到查询结果。
速度测试:在表中插入一百万条数据
> for(i=0;i<1000000;i++){
... db.users.insert(
... {
... "i":i,
... "username":"user"+i,
... "age":Math.floor(Math.random()*120),
... "created":new Date()
... }
... );
... }
WriteResult({ "nInserted" : 1 })
然后查询一个随机的用户名(新版mongo已经改了,如果按mongo权威指南则得不到该信息),可以看到扫描了一百万个文档才查询出来,执行时间1046ms。因为不知道集合里的username字段是唯一值得,mogo不得不查看集合中的每一个文档。为了优化查询,将查询结果限制为1,这样就在找到一个文档之后就会停止了。
> db.users.find({username:"user101"}).explain("executionStats")
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.users",
"indexFilterSet" : false,
"parsedQuery" : {
"username" : {
"$eq" : "user101"
}
},
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
"username" : {
"$eq" : "user101"
}
},
"direction" : "forward"
},
"rejectedPlans" : [ ]
},
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 1,
"executionTimeMillis" : 1046,
"totalKeysExamined" : 0,
"totalDocsExamined" : 1000000,
"executionStages" : {
"stage" : "COLLSCAN",
"filter" : {
"username" : {
"$eq" : "user101"
}
},
"nReturned" : 1,
"executionTimeMillisEstimate" : 986,
"works" : 1000002,
"advanced" : 1,
"needTime" : 1000000,
"needYield" : 0,
&n