首页 > 代码库 > MongoDB 索引
MongoDB 索引
创建索引
db.users.ensureIndex({‘username‘:1})
内嵌文档索引
db.users.ensureIndex({‘addr.City‘:1})
数组索引
db.users.ensureIndex({‘subject.data‘:1})
联合索引
db.users.ensureIndex({‘age‘:1,‘username‘:1})
唯一索引(超出8KB大小的键不会受到唯一索引的约束:可以插入多个同样的8KB长的字符串。)
db.users.ensureIndex({" username" : 1}, {" unique" : true})
dropDups遇到重复的保留第一条,删除其他
db.people.ensureIndex({" username" : 1}, {" unique" : true, "dropDups" : true})
sparse 只对有值的文档进行唯一,null不区分
db.ensureIndex({" email" : 1}, {" unique" : true, "sparse" : true})
查询中指定使用索引
hint({" age" : 1, "username" : 1})
选择索引的方向
一个字段键索引的时候方向无所谓。符合索引需要考虑排序。
使用覆盖索引
当一个索引包含用户请求的所有字段,可以认为这个索引覆盖了本次查询。
在实际中,应该优先使用覆盖索引,而不是去获取实际的文档。这样可以保证工作集比较小。
隐式索引
当简历{‘name‘:1,‘age‘:1}索引时,相当于同时创建了{‘name‘:1}的索引。所以不需要再建{‘name‘:1}索引
低效率的索引
$where 查询不能使用任何索引
(‘key‘:{‘$exists‘:true}) 检查该键是否存在 也不能使用索引
$ne,$not,$nin 效率低,有时会全表扫描
复合索引使MongoDB能够高效地执行拥有多个语句的查询。
设计基于多个字段的索引时,应该将会用于精确匹配的字段(比如"x":"foo")放在索引的前面,
将用于范围匹配的字段(比如"y":{"$gt":3,"$lt":5})放在最后。
这样,查询就可以先使用第一个索引键进行精确匹配,然后再使用第二个索引范围在这个结果集内部进行搜索。
"$or"可以对每个子句都使用索引,因为"$or"实际上是执行两次查询然后将结果集合并。
使用"$in"查询时无法控制返回文档的顺序(除非进行排序)。例如,使用{"x":[1,2,3]}与使用{"x":[3,2,1]}得到的文档顺序是相同的。
性能分析 explain()
"cursor":表示本次查询使用了索引。如果查询要对结果进行逆序遍历,或者是使用了多键索引,就可以在这个字段中看到"reverse"和"multi"这样的值。
"isMultiKey":用于说明本次查询是否使用了多键索引。
"n":本次查询返回的文档数量。
"nscannedObjects":这是MongoDB按照索引指针去磁盘上查找实际文档的次数。如果查询包含的查询条件不是索引的一部分,或者说要求返回不在索引内的字段,MongoDB就必须依次查找每个索引条目指向的文档。
"nscanned":如果有使用索引,那么这个数字就是查找过的索引条目数量。如果本次查询是一次全表扫描,那么这个数字就表示检查过的文档数量。
"scanAndOrder":MongoDB是否在内存中对结果集进行了排序。
"indexOnly":MongoDB是否只使用索引就能完成此次查询。
"nYields":为了让写入请求能够顺利执行,本次查询暂停的次数。如果有写入请求需要处理,查询会周期性地释放它们的锁,以便写入能够顺利执行。
"millis":数据库执行本次查询所耗费的毫秒数。这个数字越小,说明查询效率越高。
"indexBounds":这个字段描述了索引的使用情况,给出了索引的遍历范围。由于查询中的第一个语句是精确匹配。
MongoDB 索引