ITPub博客

首页 > 数据库 > > MongoDB中的索引

MongoDB中的索引

作者:浪花小雨滴 时间:2020-05-22 10:31:22 0 删除 编辑

1、普通单列索引

我们用如下代码来测试:

for(var i=0;i<200000;i++){
    db.java.insert({name:'xiao'+i,age:i})
}






第一、我们先检验一下查询性能

var start=new Date()
db.java.find({name:'xiao156789'})
var end=new Date()
end-start
17510






第二、为 name 创建索引

> db.java.ensureIndex({name:1})
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}






第三、再执行第一部分代码可以看出有数量级的性能提升

语法:db.集合名.ensureIndex({键名:1}) :1是升序,-1是降序

2、多列索引(复合索引)

创建多列索引 语法:db.集合名.ensureIndex({field1:1/-1,field2:1/-1}) 对 name 和 age 建立一个复合索引,可以使用 db.集合名.getIndexes() 查看创建的索引情况

3、子文档索引

语法: db.集合名.ensureIndex({field.subfield:1/-1}) 如下文档可以建立子文档索引

{name:'诺基亚手机1',price:12.34,spc:{weight:100,area:'纽约'}}
{name:'诺基亚手机2',price:42.34,spc:{weight:200,area:'伦敦'}}






比如要查询 weight=100 的文档

db.goods.find({'spc.weight':100})






根据当前案例,我们建立子文档索引

db.net.ensureIndex({'spc.w':1})






4、唯一索引

语法: db.集合名.ensureIndex({name:-1},{unique:true})

5、查看索引

(1) 查看当前索引状态: db.集合名.getIndexes()

(2) 详情查看本次查询使用哪个索引和查询数据的状态信息: db.集合名.find({name:''xiao}).explain()

6、删除索引

删除单个索引: db.集合名.dropIndex({filed:1/-1})

删除所有索引: db.集合名.dropIndexes()

7、重建索引

一个表经过很多次修改后,导致表的文件产生空洞,索引文件也如此,可以通过索引的重建,减少索引文件碎片,并提高索引的效率,类似 mysql 中的 optimize table 。

mysql 里面使用 optimize table 语法: optimize table 表名

语法: db.集合名.reIndex()

8、索引使用注意事项

(1) 创建索引的时候,注意1是正序创建索引,-1是倒序创建索引

(2) 索引的创建在提高查询性能的同时会影响插入性能,对于经常查询少插入

(3) 复合索引要注意索引的先后顺序

(4) 每个键全建立索引不一定就能提高性能,索引不是万能的。

(5) 在做排序工作的时候如果是超大数据量也可以考虑加上索引用来提高排序的性能。

作者:Angel_Kitty
链接:imooc.com/article/75436
来源:慕课网




推荐阅读:

如何确定自己是否适合做程序员?

半路学编程,可以成为大牛吗?

如何使用 GitHub?

在做程序员的道路上,你掌握了什么概念或技术使你感觉自我提升突飞猛进?

你看过/写过哪些有意思的代码?

如何在程序里留下彩蛋?

为什么部分程序员下班后只关显示器不关电脑?

有哪些好笑的关于程序员的笑话?

如何防止自己被人肉搜索到?

面试必备之乐观锁与悲观锁

慕课网:搞定计算机网络面试,看这篇就够了(补充版)

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3156261/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2018-05-16

  • 博文量
    4259
  • 访问量
    39977