开发者学堂课程【MongoDB精讲课程(上):索引的管理操作】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/726/detail/12962
索引的管理操作
内容介绍:
一、索引的查看
二、索引的创建
三、索引的移除
注:索引是一个小的集合,同时也会占用空间,若集合里创建了过多不必要的索引则会影响插入效果。
一、索引的查看
1、说明
返回一个集合中的所有索引的数组
2、语法命令
db.collection.getIndexes()
//collection:集合名称
//getIndexes:查询集合当中所有的索引
3、示例
输入内容:
> db.comment.getIndexes()
执行结果如下:
分析结果发现:
(1)虽然输入时并没有创建索引,但索引查询的结果是一个数组,数组里面包含多个索引。
(2)在 ”key”:{“_id”:1} ,中的 ”_id” 是我们的主键, mongodb 和 mysql 非常类似,在于主键都会默认创建一个唯一索引。
(3)分析四个字段分别代表的含义,使信息描述清楚。
①首先”v”代表的是索引的引擎版本号(Version)。
②“2”代表的是当前 mongdodb 索引的引擎版本是第二个版本
//这两项为次要内容,仅作为了解补充。
③ “key” 是指在哪个字段上加索引,示例默认显示加的是主键, key 后面的“1”代表索引是通过升序的方式。
④ ”name” 代表索引的名称,默认是字段名 id 前加下划线。
⑤ “ns” 代表索引存放在哪个数据库下面的哪个集合,之后会有详细介绍。
// _id 存放在 articledb 数据库里面的 comment 集合里
二、索引的创建
1、说明
在集合上创建索引
2、语法
db.collection.createIndex(keys,options)
// collection:集合名称
// createIndex:调用的函数或者方法,里面包含两个参数,分别是 keys 和 options
// keys 指在某些字段上要加索引, mongodbd 索引类型分单字段索引和复合字段索引,当字段需要加入多个复合索引时就为多个 keys。
// options(可选择的),基本上用的较少,比较常见的有 unique 和 name,unique 是指当你创建索引的时候,建立的索引是否唯一,mongodb 和 mysql 对于这点是一致的,若两者不能冲突,只能设置成唯一,name 是指索引的名称,若未指定,MongoDB 将通过连接索引的字段名和排序顺序生成一个索引名称,即字段名加下划线,若指定,可以自行设置名称。
unique 和 name 是比较常用的,其他的可作为了解,可选项可加可不加,系统默认创建 keys ,我们需要学会使用。
3、示例
(1)单字段索引示例
对 userid (经常查询要用到)字段建立索引:
输入内容:
> db.comment.createIndex({userid:1})
// userid是参数,“1”代表升序索引,“-1”代表降序索引,若为单字段,升序和降序基本上不影响索引的质量,此示例使用升序的索引进行示范。可选项可以不写,直接按回车得到以下结果:
之后我们再进行查询,输入内容:
> db.comment.getIndexes()
得到以下结果:
通过分析结果发现,这时出现两个索引,因为索引名称没有指定,则自动以升序的方式默认字段名加下划线。
(2)复合索引示例
对 userid 和 nickname 同时建立复合 (Compound) 索引:
输入内容:
> db.comment.createIndex({userid:1,nickname:-1})
//在创建 keys 的时,带多个字段 {userid:1,nickname:-1},此时 nickname 使用降序。
复合索引创建结果如下:
之后再进行查询,输入内容:
> db.comment.createIndexes()
得到以下结果:
分析结果可得:
结果中出现三个索引,第一个索引为默认的主键索引。第二个为之前创建的单字段索引,字段索引名称 name 默认为userid_1,此处的“1”仍代表升序,第三个为复合索引,key 带有多个字段,分别是 userid 和 nickname,与之前唯一的区别在于,索引名称变为复合名称 userid_1_nickname_-1。
三、索引的移除
1、说明
可以移除指定的索引,或移除所有索引。
2、语法
db.collection.dropIndex(index)
// dropIndex:删除指定的索引
// index:指定要删除的索引
3、移除指定索引的两个方法
(1)可以通过索引规范文档指定索引进行删除
(2)可以通过索引名称指定索引进行删除
//若要删除文本索引,只能使用指定索引名称这种方式进行删除。文本索引接触较少,此知识点作为了解补充。
示例1:
通过索引规范文档指定索引删除 comment 集合中 userid 字段上的升序索引:
输入内容:
> db.comment.dropIndex({userid:1})
//将 {userid:1} 作为条件放入括号中。
按回车后再输入 > db.comment.getIndexes() 进行查询
查询结果如下:
分析结果得出,从之前的三个索引变成了两个索引,userid 字段上的升序索引已经被删除。
示例2:
通过索引名称指定索引删除 comment 集合中 userid 字段上的升序索引:
输入内容:
> db.comment.dropIndex(
“ userid_1_nickname_-1”)
按回车后再输入 > db.comment.getIndexes() 进行查询
查询结果如下:
分析结果得出,最后只剩下一个索引,其他索引都已被删除。
4、所有索引的移除
(1)语法
db.collection.dropIndexes()
// dropIndex:指删除单个索引
// dropIndexes:指删除全部索引,删除所有索引时无需指定任何参数。
(2)示例
输入内容:
> db.comment.dropIndexes()
按回车后再输入 > db.comment.getIndexes() 进行查询
查询结果如下:
分析得出,除了 id 以外的其他索引都会被删除。