1、我们知道如果索引使用的得当,会大幅提升查询速度,而如果使用不当有可能会使全部操作性能降落所以在建立索引的时候要斟酌以下几点:
(1)、会做甚么样的查询,哪些键需要建立索引
(2)、每一个键的索引方向是怎样样的
(3)、如何应对扩大,怎样排序键的方向,使更多经常使用的数据保存在内存中
2、这里注意1下,建立索引的时候可使用 1,⑴ 建立不同方向的索引
3、使用ensureIndex() 在指定的键上创建索引
4、建立普通索引:使用 ensureIndex()函数
例:db.mytest.ensureIndex({age:1})
//mytest集合中文档的age键建立1个方向为“1”的索引
5、内嵌文档建立索引:
例:db.mytest.ensureIndex({comment.data:1})
//在mytest这个集合的comment这个键的data键上创建索引,内嵌索引和1般的索引是1样的!
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、唯1索引:唯1索引可以保证集合中每个文档的指定键都有唯1值
例:db.mytest.ensureIndex({name:1},{unique:true})
// 在mytest集合中的文档的name键创建唯1索引,那末集合中文档的name键的值不会有重复的!
11、消除重复值:当我们在1个集合中先创建了文档,而其中有些文档的值值重复的,这时候我们建立唯1索引,选择dropDups这个选项则会把第1索引到的文档保存,以后的就会被删除!
例:db.mytest.ensureIndex({name:1},{unique:true,dropDups:true})
//mytest集合下文档的name键创建方向为‘1’的唯1索引,如果文档的name键的值有重复,则保存第1个检索到的值,而以后的文档就会被删除
12、复合唯1索引:这个和结构化数据库表的键很相似,如果这个表的键是1个属性肯定的则这个属性的值不能相同,而如果这个键是由两个或多个属性组成,则只要这多个属性的值组合起来你能唯1肯定1行数据就能够,而单个属性的值可以相同,这个和唯1索引,复合唯1索引的定义表达一样的意思
例:db.mytest.ensureIndex({name:1,id:1},{unique:true})
// 在mytest这个集合下的文档的name id 键创建复合唯1索引,mytest集合下的文档的name或id可以重复,而两值1起只能肯定1个文档,不能重复!
13、使用explain()工具查看具体信息:
例:db.mytest.find().explain()
// mytest集合中有8个文档
// cursor:'basicCursor' 说明这个查询没有使用索引,这个正常由于查询没有条件
// nscanned: 代表数据库查找了多少个文档
// n代表数据返回的文档的数量
// millis:毫秒数代表查询使用的时间
14、有查询条件的看看索引
例:db.mytest.find({age:2}).explain()
// 第1行数据就产生了变化,使用了btree索引,索引名称是age_1
//nscanned:查询的文档树变成1,由于有索引,所以不会进行全表扫描,所以查找的文档数变少
1、修改索引:我们知道建立索引会费时,浪费资源,在建立索引期间,所有的数据库的要求都会被阻塞,为了能够正常要求数据库我们可以将索引的建立在后台进行履行。
2、使用{background:true} 选项可以将索引的建立在后台履行,这样就能够正常要求数据库,但有个缺点就是,索引的建立相对会慢1些!
3、删除索引: collection.dropIndex({xxx:1/⑴})
例:db.mytest.dropIndex({age:1})
// 从mytest这个集合中的文档的age这个键上创建的索引
4、删除所有索引: dropIndexes()
例:db.mytest.dropIndexes()
// 删除这个集合下的文档的多个键上创建的所有索引,包括_id 上的索引,通过运行结果可以看到!
5、之前说到mongodb的索引的建立使用 1,⑴ 来表示方向的,而mongodb还能建立地理空间索引,地理空间索引的建立使用'2d'来表示而不再是 1,⑴
6、建立2d索引:ensureIndex()建立地理空间索引的键是有要求的:键的值必须是1对值,或1个数据或1对键值对
例: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的索引,由于他们的索引的理念是1样的!