文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
复合索引
复合索引简单理解就是:两条以上的索引。
不用索引的情况:
- 数据不超万条时,不需要使用索引。性能的提升并不明显,而且大大增加了内存和硬盘的消耗;
- 查询数据超过表数据量 30%时,不要使用索引字段查询。实际证明会比不使用索引更慢,因为它大量检索了索引表和我们原表;
- 数字索引,要比字符串索引快的多,在百万级甚至千万级数据量面前,使用数字索引是个明确的选择;
- 把我们经常查询的数据做成一个内嵌数据(对象型的数据),然后集体进行索引
现在把
randNum0
这个字段也设置成索引。
> db.randomInfo.ensureIndex({randNum0:1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 2,
"numIndexesAfter" : 3,
"ok" : 1
}
一共有三个索引,两个自建索引
username 和 randNum0
。
> db.randomInfo.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "user.randomInfo"
},
{
"v" : 2,
"key" : {
"username" : 1
},
"name" : "username_1",
"ns" : "user.randomInfo"
},
{
"v" : 2,
"key" : {
"randNum0" : 1
},
"name" : "randNum0_1",
"ns" : "user.randomInfo"
}
]
/**
* 200 万数据复合索引检索
*/
var startTime = new Date().getTime(); // 得到程序开始运行的时间
var db = connect('user'); // 链接数据库
var res = db.randomInfo.find({username: 'n7wl5kq', randNum0: 754417}); // 根据用户名和 randNum0 查找用户
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("5cbb16755328a836aca866fb"),
"username" : "n7wl5kq",
"regeditTime" : ISODate("2019-04-20T12:54:01.742Z"),
"randNum0" : 754417,
"randNum1" : 405438,
"randNum2" : 513075,
"randNum3" : 888891,
"randNum4" : 586031,
"randNum5" : 704484,
"randNum6" : 906708,
"randNum7" : 303593,
"randNum8" : 164085,
"randNum9" : 589671
}
This run time is: 20ms
true
查询时间还是在 20ms 左右。MongoDB 的复合查询是按照我们的索引顺序进行查询的。就是我们用 db.randomInfo.getIndexes()
查询出的数组。
hint 方法指定索引查询
我们都知道数字索引要比字符串索引快,这就需要一个方法来打破索引表的查询顺序,优先使用我们自己指定的索引查询,这个方法就是 hint()
.
var res = db.randomInfo.find({username: 'n7wl5kq', randNum0: 754417}).hint({randNum0:1});
由于数据量和复杂程度还是不大,所以我们看不出来明显的性能提升,但是,当我们在工作中遇到大数据时,一定会得到很好的效果。
删除索引
当索引性能不佳或起不到作用时,我们需要删除索引,删除索引的命令是 dropIndex()
。
db.randomInfo.dropIndex('randNum0_1'); //索引的唯一 ID
需要注意的是:删除索引时填写的值,并不是我们的字段名称(key,即 randNum0),而是我们索引查询表中的 name 值。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论