索引入门


普通查询性能

我们先制作一个普通查询,随便查找一个用户名,并计算出查询和打印的时间,因为有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个索引值。


文章作者: 技术潘
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 技术潘 !
  目录