索引 : 相当于书的目录 mongodb限制每个集合上最多有64个索引 通常,一个特定的集合中不应该有两个以上的索引
db.coll.ensureIndex({"name" : 1})   // 创建索引 在已有的文档上建索引比先建索引再插入文档快
db.coll.dropIndex("name_1")                   // 删除索引
db.coll.getIndexes()   // 查看索引
复合索引 :
选择键的方向 :
db.coll.ensureIndex({"name" : 1, "age" : 1})  // 创建复合索引 值为1代表升序,值为-1代表降序 创建复合索引时可以根据实际情况来创建
db.coll.ensureIndex({"name" : -1, "age" : 1}) // 和{"name" : 1, "age" : -1}效果一样 
db.coll.find({"name" : "hhh"}).explain()
使用覆盖索引 : 
指定不需要返回的值如"_id" db.coll.find({}, {"_id", 0})
隐式索引 :
abcd索引 就可以使用abc ab a索引,但是b ac等是不行的
注意索引的前后顺序 {"name" : 1, "age" : 1} 和 {"age" : 1, "name" : 1}是不一样的,如果有范围查询,应该先将精确查询的索引放前面,再将范围查询的索引放在后面
使用索引时$or的的查询效率没有$in高
索引对象和数组 :
索引嵌套文档 :
db.coll.ensureIndex({"cont.name" : 1})
可以为文档建索引 : 必须查询整个文档所有字段匹配时才起作用
也可以为文档中的字段建索引
索引数组 :
db.coll.ensureIndex({"cont.name" : 1})
不能索引整个数组
可以对数组中的字段建索引,实际上是对数组中每个相同的字段建索引
一个索引中的数组字段最多有一个
索引的基数 : 索引的字段不同值的数量 一般在基数大的字段建索引效果更好
db.coll.find().hint({"name" : 1}).explain() // hint的作用是强制使用某个索引 explain的作用是查看查询信息 : allPlans字段显示了查询计划
db.coll.find().hint({"$natural" : 1})       // 对于大小不经常变动的文档,强制使用全表扫描
唯一索引 : 如果文档中没有索引键对应的值会被插入null
db.coll.ensureIndex({"name" : 1}, {"unique" : true}) // 唯一索引,键所对应的值是唯一的 键大小超过1KB就不会受到唯一索引的约束了
db.coll.ensureIndex({"name" : 1}, {"unique" : true, "dropDups" : true}) // 强制建立唯一索引,重复值只取第一个
稀疏索引 : 被索引的键可有可无 可以强制全表扫描来解决
db.coll.ensureIndex({"name" : 1}, {"sparse" : true}) // 
db.coll.ensureIndex({"name" : 1}, {"unique" : true, "sparse" : true}) // 解决唯一索引会插入空值得情况