文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
索引
构造百万级数据
索引的性能体现必须要有大量数据才能看出来,如果说只有有 10 条 20 条数据,是根本看不出来效果的,我们首先通过随机数的方法,构造出一个百万级数据的数据库出来。
//生成随机数
function createRandomNum(min, max) {
let range = max-min; // 得到随机数区间
let rand = Math.random(); // 得到随机值
return (min + Math.round(rand *range)); // 最小值+随机数取整
}
// console.log(createRandomNum(10000, 99999));
// 生成随机用户名
function createRandomUserName(min, max){
let tempStringArray= "123456789qwertyuiopasdfghjklzxcvbnm".split('');//构造生成时的字母库数组
let outPutText = ''; //最后输出的变量
//进行循环,随机生产用户名的长度,这里需要生成随机数方法的配合
for(let i=1; i < createRandomNum(min, max); i++) {
//随机抽取字母,拼装成需要的用户名
outPutText = outPutText + tempStringArray[createRandomNum(0,tempStringArray.length)];
}
return outPutText;
}
// console.log(createRandomUserName(7, 16));
// var startTime=(new Date()).getTime();
var db = connect('user');
db.randomInfo.drop();
var tempInfo = [];
for (let i = 0; i < 2000000; i++) {
tempInfo.push({
username: createRandomUserName(7, 16),
regeditTime: new Date(),
randNum0: createRandomNum(100000,999999),
randNum1: createRandomNum(100000,999999),
randNum2: createRandomNum(100000,999999),
randNum3: createRandomNum(100000,999999),
randNum4: createRandomNum(100000,999999),
randNum5: createRandomNum(100000,999999),
randNum6: createRandomNum(100000,999999),
randNum7: createRandomNum(100000,999999),
randNum8: createRandomNum(100000,999999),
randNum9: createRandomNum(100000,999999),
})
}
db.randomInfo.insert(tempInfo);
> load('./createRandomUser.js')
connecting to: mongodb://127.0.0.1:27017/user
MongoDB server version: 3.6.3
true
// 查看数据量
> db.randomInfo.stats().count
2000000
>
普通查询性能
200 万数据普通检索:
var startTime = new Date().getTime(); // 得到程序开始运行的时间
var db = connect('user'); // 链接数据库
var res = db.randomInfo.find({username: '5pnyce'}); // 根据用户名查找用户
res.forEach(item => printjson(item)); // 循环输出
var runTime = new Date().getTime() - startTime; // 得到程序运行时间
print('This run time is: ' + runTime + 'ms'); //打印出运行时间
> load('./customSearch.js')
connecting to: mongodb://127.0.0.1:27017/user
MongoDB server version: 3.6.3
{
"_id" : ObjectId("5cbb16755328a836aca866f9"),
"username" : "5pnyce",
"regeditTime" : ISODate("2019-04-20T12:54:01.742Z"),
"randNum0" : 725085,
"randNum1" : 401201,
"randNum2" : 600271,
"randNum3" : 145201,
"randNum4" : 292000,
"randNum5" : 511782,
"randNum6" : 915503,
"randNum7" : 427219,
"randNum8" : 513973,
"randNum9" : 246754
}
This run time is: 3779ms
true
从上面运行结果来看,大概需要 3.7 秒,这个时间是没办法满足我们的日常查询的。
创建索引
数据量少的时候,不使用索引查询速度还是很快的;但是当数据量较大时,不使用索引的话查询速度将会变的很慢。
// 查看当前集合的索引,目前只有一个_id_索引
> db.randomInfo.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "user.randomInfo"
}
]
>
MongoDB
使用ensureIndex({key: 1})
方法来创建索引:
key 为我们要创建的索引字段,1 为按升序创建索引,-1 为按降序创建索引。
也可以设置使用多个字段创建索引(关系型数据库中称作复合索引)db.col_name.ensureIndex({key:1})
。需要注意的是:3.0 版本后推荐使用 createIndex()
来创建索引。
为用户名
username
建立索引:
> db.randomInfo.ensureIndex({username:1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1 // 说明创建索引成功了
}
// 再次查看索引
> db.randomInfo.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "user.randomInfo"
},
{
"v" : 2,
"key" : {
"username" : 1
},
"name" : "username_1",
"ns" : "user.randomInfo"
}
]
重新查询:
> load('./customSearch.js')
connecting to: mongodb://127.0.0.1:27017/user
MongoDB server version: 3.6.3
{
"_id" : ObjectId("5cbb16755328a836aca866f9"),
"username" : "5pnyce",
"regeditTime" : ISODate("2019-04-20T12:54:01.742Z"),
"randNum0" : 725085,
"randNum1" : 401201,
"randNum2" : 600271,
"randNum3" : 145201,
"randNum4" : 292000,
"randNum5" : 511782,
"randNum6" : 915503,
"randNum7" : 427219,
"randNum8" : 513973,
"randNum9" : 246754
}
This run time is: 25ms
true
只需要 25ms,查询性能大大提升。
总结:无论是在关系型数据库还是非关系型数据库,建立索引都是非常重要的。但是,需要注意的是:索引是要消耗硬盘和内存资源的,所以还是要根据程序需要进行建立了。MongoDB 也给我们进行了限制,只允许我们建立 64 个索引值。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论