使用索引查询几乎可以瞬间完成,但是对于添加的每一个索引,每次写(插入,更新,删除)操作都将耗费更多的时间。这是因为每次数据发生变动时,MongoDB不仅要更新文档,还要更新集合上的所有索引。因此,MongoDB限制每个集合最多只能有64个索引。但是,通常在一个集合上,不应该拥有两个以上的索引。
在某字段上创建索引:db.test.ensureIndex({"name": 1})
查看MongoDB在执行查询过程中所做的事情:db.test.find({"name": "zhangsan"}).explain()
查看MongoDB创建索引的进度:1. db.currentOp() 或者 2.检查MongoDB的日志
终止正在进行的索引创建过程:db.killOp()
查看当前集合中的所有索引:db.test.getIndexes()
返回当前数据库中的所有索引:db.system.indexs.find()
删除一个特定集合上的所有索引:db.test.dropIndexes()
删除集合中的某一个索引:db.test.dropIndex({x: 1, y: -1})
也可以直接执行命令进行删除:
db.runCommand({dropIndexes:'foo', index : {y:1}})//删除集合foo中{y:1}的索引
db.runCommand({dropIndexes:'foo', index : '*'}) //删除集合foo中所有的索引
使用 explain() 返回查询计划
在任意游标(例如 查询)后面附加 explain() 方法可以返回一个含有查询过程的统计数据的文档,包括所使用的索引,扫描过的文档数,查询所消耗的毫秒数。
使用 hint() 控制索引使用
在任意游标(例如 查询)后面附加 hint() 方法并以索引作为方法参数可以强制MongoDB使用指定的索引来匹配查询。
您可以使用联合使用 hint() and explain() 来逐个对比每个索引的效率。您可以在 hint() 方法中指定 $natural 操作符来避免MongoDB使用任何索引(即:查询不会使用索引)。