普通查询性能
我们先制作一个普通查询,随便查找一个用户名,并计算出查询和打印的时间,因为有200万条数据,所以性能不会很高。
var startTime = new Date().getTime() //得到程序运行的开始时间
var db = connect('company') //链接数据库
var rs=db.randInfo.find({username:"gu7v2dtb"}) //根据用户名查找用户
rs.forEach(rs=>{printjson(rs)}) //循环输出
var runTime = new Date().getTime()-startTime; //得到程序运行时间
print('[SUCCESS]This run time is:'+runTime+'ms') //打印出运行时间
上边的代码就是一个普通的查询,只不过是记录了时间。在终端运行后,可以得到大概的运行时间是0.8秒左右(电脑性能不同,有所不同),第一次无缓存的运行时间大概是3.5秒左右。这个时间是没办法满足我们的日常查询的。
建立索引
试着为用户名(username)建立索引。建立索引只需要一句话就可以了。
db.randInfo.ensureIndex({username:1})
查看现有索引
db.randInfo.getIndexes()
终端的结果,现在只有一个索引值:
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "company.randInfo"
}
]
那现在使用命令建立一下索引db.randomInfo.ensureIndex({uername:1}),我的电脑大概要50秒左右,建立好后我们重新使用db.randomInfo.getIndexes(),查看一下结果。
结果如下:已经变成了两条索引。
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "company.randInfo"
},
{
"v" : 2,
"key" : {
"username" : 1
},
"name" : "uername_1",
"ns" : "company.randInfo"
}
]
然后我们再来load一下demo09.js文件(load(‘./demo09.js’)),看一下现在多少秒可以查询出来。这时候查询的时间缩短到了4ms左右,查询性能提升了大概200倍左右。
总结:无论是在关系型数据库还是文档数据库,建立索引都是非常重要的。前边讲了,索引这东西是要消耗硬盘和内存资源的,所以还是要根据程序需要进行建立了。MongoDB也给我们进行了限制,只允许我们建立64个索引值。