一、索引基础:
MonogDB的索引和大部分关系型数据库一模一样,其中包括了一些基本的优化技巧,以前具有索引知识完全通用。
索引的创建命令:
db.test.ensureIndexes({id:1})
其中数组1表示索引按升序存储,-1表示索引按降序排列存储
查询索引的命令:
db.test.getIndexes
删除索引的命令:
db.test.dropIndex({id:1})
在MongoDB中,也可以建立复合索引
db.test.ensureIndex({id:1,name:-1})
索引建立后,有索引的字段查询时会用到该索引,使用id查询时会有索引,使用id和name查询是也有索引,但是如果仅仅使用name进行查询,则没有索引可以使用。因策,如果使用了复合索引,想在查询中使用索引,必须是复合索引的前N个索引,才会有效。然而,如果查询查询条件中的键值顺序和复合索引中的创建顺序不一致的话,MongoDB会字段帮助我们调整顺序,以便使用复合索引。
db.test.find({name:"",age:1})
对于上面的查询,MongoDB会在检索前将动态的调整查询条件,以便使用创建的索引。
二、唯一索引
在默认情况下创建的索引均不是唯一索引,创建唯一索引的命令:
db.test.ensureIndex({id:1},{unique:true})
如果再次插入id重复的文档时,MongoDB会报错,而且会提示重复的键
删除唯一索引的方式和删除索引是一样的
我们也可以创建复合唯一索引,即保证复合键值唯一即可
三、使用explain
explain是非常有用的工具,可以帮助我们获得查询方面诸多有用的信息,只要对游标调用该方法,就会获得相应的查询细节。
其中:
"cursor":"BasicCursor"表示没有使用索引
"nscanned":3表示查询了多少个文档
"n":3 表示返回了多少个文档
"millis":0表示整个查询的耗时
四、索引管理
system.indexes集合中包含了每一个索引的详细信息,因此可以通过下面的命令进行查询
db.system.indexes.find()
如果在为已有的文档创建索引时,可以在后台执行索引的创建,这样就不会阻塞其他的操作,但是阻塞创建效率更高,但是MongoDB这时就无法进行其他的操作了
db.test.ensureIndex({id:1},{background:true})