为什么80%的码农都做不了架构师?>>>
1、在user集合中创建10000条数据记录,顺便说一句:在2.6的版本执行下面的语句需要将近一分钟
> for(var i=1;i<=100000;i++) {var rand=parseInt(i*Math.random());db.user.insert({"name":"Dreyer"+i,"age":i})}
WriteResult({ "nInserted" : 1 })
2、查询name为Dreyer1000的记录数据,利用mongodb中自带的explain性能分析函数
> db.user.find({"name":"Dreyer1000"}).explain();
{
"cursor" : "BasicCursor",
"isMultiKey" : false,
"n" : 1,
"nscannedObjects" : 100000,
"nscanned" : 100000,
"nscannedObjectsAllPlans" : 100000,
"nscannedAllPlans" : 100000,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 781,
"nChunkSkips" : 0,
"millis" : 110,
"server" : "localhost.localdomain:27017",
"filterSet" : false
}
其中上面的
"cursor" : "BasicCursor",代表的是全表扫描的意思,
"nscanned" : 100000,代表的是扫描了100000个文档数据
"n" : 1,表示最终返回了一个文档
"millis" : 110,表示执行耗时110毫秒
3、给name字段建立索引,ensureIndex用于创建索引,1代表按照name进行升序,-1代表按照name进行降序
> db.user.ensureIndex({"name":1})db.user.ensureIndex({"name":1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
我们也可以使用getIndexes语句查看集合中的索引信息
> db.user.getIndexes();
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "users.user"
},
{
"v" : 1,
"key" : {
"name" : 1
},
"name" : "name_1",
"ns" : "users.user"
}
]
>
4、再次查询name为Dreyer1000的记录数据并分析
> db.user.find({"name":"Dreyer100"}).explain();
{
"cursor" : "BtreeCursor name_1",
"isMultiKey" : false,
"n" : 1,
"nscannedObjects" : 1,
"nscanned" : 1,
"nscannedObjectsAllPlans" : 1,
"nscannedAllPlans" : 1,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
"name" : [
[
"Dreyer100",
"Dreyer100"
]
]
},
"server" : "localhost.localdomain:27017",
"filterSet" : false
}
>
建立索引之后,mongodb采用B树的结构来存放索引,只用一次就获取到了我们想要的数据,花费的时间都没有超过1毫秒