首页 > 代码库 > mongoDB索引相关命令总结

mongoDB索引相关命令总结

一、在集合中文档的某个键上面建立索引:

1、我们知道如果索引使用的得当,会大幅提升查询速度,而如果使用不当有可能会使整个操作性能下降所以在建立索引的时候要考虑如下几点:

(1)、会做什么样的查询,哪些键需要建立索引

(2)、每个键的索引方向是怎么样的

(3)、如何应对扩展,怎么排序键的方向,使更多常用的数据保存在内存中

2、这里注意一下,建立索引的时候可以使用 1,-1 建立不同方向的索引

3、使用ensureIndex() 在指定的键上创建索引

4、建立普通索引:使用 ensureIndex()函数

例:db.mytest.ensureIndex({age:1})

//mytest集合中文档的age键建立一个方向为“1”的索引

5、内嵌文档建立索引:

例:db.mytest.ensureIndex({comment.data:1})

//在mytest这个集合的comment这个键的data键上创建索引,内嵌索引和一般的索引是一样的!

6、为排序(Sort)做索引,如果没有索引,或调用了没有建立索引的键值进行排序,则mongodb会将所有数据加载到内从进行排序,这样如果数量大,不能再内存中进行排序则会报错,

7、索引的名称默认按照:keyname1_dirx_keyname2_dirx的格式来显示,其中的keyName1 就是默认的索引名称,dirx就是建立的索引的方向

8、索引名的查看:indexs.find()

例:db.mytest.indexs.find();

// 查看在mytest集合下的所有的索引

9、建立索引时,自定义索引名称:

例:db.mytest.ensureIndex({age:1},{name:‘indexname‘})

技术分享


// 在mytest集合中文档的age键创方向为1的索引,索引名称为indexname

10、唯一索引:唯一索引可以保证集合中每一个文档的指定键都有唯一值

例:db.mytest.ensureIndex({name:1},{unique:true})

// 在mytest集合中的文档的name键创建唯一索引,那么集合中文档的name键的值不会有重复的!

11、消除重复值:当我们在一个集合中先创建了文档,而其中有些文档的值值重复的,这时我们建立唯一索引,选择dropDups这个选项则会把第一索引到的文档保存,之后的就会被删除!

例:db.mytest.ensureIndex({name:1},{unique:true,dropDups:true})

//mytest集合下文档的name键创建方向为‘1’的唯一索引,如果文档的name键的值有重复,则保留第一个检索到的值,而之后的文档就会被删除

12、复合唯一索引:这个和结构化数据库表的键很相似,如果这个表的键是一个属性确定的则这个属性的值不能相同,而如果这个键是由两个或多个属性组成,则只要这多个属性的值组合起来你能唯一确定一行数据就可以,而单个属性的值可以相同,这个和唯一索引,复合唯一索引的定义表达同样的意思

例:db.mytest.ensureIndex({name:1,id:1},{unique:true})

// 在mytest这个集合下的文档的name id 键创建复合唯一索引,mytest集合下的文档的name或id可以重复,而两值一起只能确定一个文档,不能重复!

13、使用explain()工具查看具体信息:

例:db.mytest.find().explain()

// mytest集合中有8个文档

技术分享

// cursor:‘basicCursor‘ 说明这个查询没有使用索引,这个正常因为查询没有条件

// nscanned: 代表数据库查找了多少个文档

// n代表数据返回的文档的数量

// millis:毫秒数代表查询使用的时间

14、有查询条件的看看索引

例:db.mytest.find({age:2}).explain()

技术分享

// 第一行数据就发生了变化,使用了btree索引,索引名称是age_1

//nscanned:查询的文档树变为一,因为有索引,所以不会进行全表扫描,所以查找的文档数变少

 

二、管理索引:

1、修改索引:我们知道建立索引会费时,浪费资源,在建立索引期间,所有的数据库的请求都会被阻塞,为了能够正常请求数据库我们可以将索引的建立在后台进行执行。

2、使用{background:true} 选项可以将索引的建立在后台执行,这样就可以正常请求数据库,但有个缺点就是,索引的建立相对会慢一些!

3、删除索引: collection.dropIndex({xxx:1/-1})

例:db.mytest.dropIndex({age:1})

// 从mytest这个集合中的文档的age这个键上创建的索引

4、删除所有索引: dropIndexes()

例:db.mytest.dropIndexes() 

技术分享

// 删除这个集合下的文档的多个键上创建的所有索引,包括_id 上的索引,通过运行结果可以看到!

 

5、之前说到mongodb的索引的建立使用 1,-1 来表示方向的,而mongodb还能建立地理空间索引,地理空间索引的建立使用‘2d‘来表示而不再是  1,-1

6、建立2d索引:ensureIndex()建立地理空间索引的键是有要求的:键的值必须是一对值,或一个数据或一对键值对

例:db.mytest.insert({age:1,name:‘name1‘,map:[2,2]})

db.mytest.insert({age:2,name:‘name2‘,map:[2,3]})

….

db.mytest.insert({age:5,name:‘name5‘,map:[5,6]})

添加多条数据

建立地理空间索引:

例:db.mytest.ensureIndex({"map":"2d"})

技术分享

7、地理空间索引查询:使用 $near

从中查找离[5,5]最近的两个点:例:db.mytest.find({map:{"$near":[5,5]}}).limit(2)

 技术分享

8、按照图形来查找:方形{"$within":{"#box":[[2,2],[6,6]]}}

例:db.mytest.find({"map":{"$within":{"$box":[[2,2],[6,6]]}}})

 

9、按照图形查找:圆形{"$within":{"#center":[[3,3],1]}}

例:db.mytest.find({"map":{"$within":{"$center":[[3,3],1]}}})

 技术分享

//[[3,3],1]以3,3 作为圆心,以1作为半径,查找离圆心由近到远的点


注意:这里只是总结了mongodb中索引相关的命令,而怎么建立高性能的索引及索引相关知识点深入学习可以学习MYSQL的索引,因为他们的索引的理念是一样的!

mongoDB索引相关命令总结