索引提高读取操作的效率,减少查询操作需要处理的数据量。这简化了MongoDB 实现查询关联的工作。
创建索引以支持读操作
如果您的应用程序使用特定字段或字段查询一个集合,那么被查询的字段上的索引可以防止该查询去扫描整个集合以查找并返回查询结果。
注意,对于单字段索引,升序和降序之间选择是无关紧要的。对于复合索引,选择是很重要的。
查询的选择性
有些查询操作是没有选择性的,这些操作不能有效地使用索引,或根本无法使用索引。
不等式运算符 $nin 和 $ne 不是非常有选择性,因为它们常常匹配索引很大一部分。其结果是,在大多数情况下,$nin 或 $ne 使用索引进行查询的性能可能不比扫描整个集合的性能好。
使用内联JavaScript 正则表达式或 $regex 运算符表达式,指定正则表达式的查询不能使用索引。但是有一个例外,指定正则表达式与锚在字符串的开头的查询可以使用索引。
覆盖一个查询
在以下情况下一个索引可以覆盖整个查询,
l 查询中的所有字段都是该索引的一部分
l 并且返回与查询匹配的文档中的所有字段都在相同的索引中。
对于这些查询,MongoDB 不需要检查在索引之外的文件。这往往比检查整个文档更为高效。
例如:对于一个集合inventory,该集合上type和item字段都有索引{type:1,item:1}
这个索引覆盖了下面的这个查询的所有条件,并且该查询的返回结果也都是包含在该索引中:
db.inventory.find( { type: ”food”, item: /^c/ }, { item: 1,_id: 0 } )
然而,下面的这个查询没有被该索引完全覆盖,因为其返回结果中有_id字段:
db.inventory.find( { type: “food”, item:/^c/ }, {item: 1 } )