返回介绍

索引

发布于 2024-12-09 12:55:35 字数 5139 浏览 0 评论 0 收藏 0

构造百万级数据

索引的性能体现必须要有大量数据才能看出来,如果说只有有 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文