查询优化
索引可以提高读取操作的效率,减少了数据查询需要操作的处理量。这简化了MongoDB执行全面查询的相关工作。
一、创建索引来支持读操作
如果您的应用程序查询特定的字段或多个字段,查询字段或字段的索引可以阻止查询从整个集合来搜索查找,并返回查询结果。有关索引的详细信息,参考MongoDB的索引的完整文档。
例如:
一个应用程序从inventory集合的type字段上进行查询。类型字段的值是由用户输入的。
var typeValue = <someUserInput>;
db.inventory.find( { type: typeValue } );
为了改善这种查询的性能,添加一个升序或者降序的索引在inventory集合的type字段上。在mongo命令行,您可以使用db.collection.ensureIndex()方法创建索引:
db.inventory.ensureIndex( { type: 1 } )
该索引可以阻止上面的查询从整个集合扫描返回结果。
分析用索引查询的性能,请参阅分析查询性能..
除了优化读取操作,索引可以支持排序操作,并允许更高效的存储利用率。有关创建索引的更多信息参考db.collection.ensureIndex()和索引教程。
对于单字段索引,升序和降序之间的选择是无关紧要的。对于复合索引,选择是重要的。更多信息请参考索引排序。
二、选择性查询
一些查询操作是没有选择性。这些操作不能有效地使用索引或不能使用索引。
不等式运算符$nin和$ne不是非常有选择性,因为他们经常匹配索引的很大一部分,作为结果,在大多数情况下,用索引的一个$nin或者$ne查询并不比只用nin或者$ne扫描一个集合中的所有文档执行的更好。
指定正则表达式的查询,与内嵌的JavaScript正则表达式或$regex运算符的表达式,不能使用索引有一个例外。字符串的开头锚点处指定正则表达式查询可以使用索引。
三、覆盖查询
索引覆盖查询
1.所有查询中的字段有一部分是索引
2.所有符合查询的文档返回的字段有相同的索引。
对于这些查询,MongoDB不需要在索引之外查阅文档。这往往比检查整个文档更有效率。
示例:
给inventory集合在type和item字段用下面的索引:
{ type: 1, item: 1 }
索引将覆盖下面查询的type和item字段,而只返回item字段.
db.inventory.find( { type: "food", item:/^c/ },
{ item: 1, _id: 0 } )
然而,该索引将不覆盖以下查询,它返回的item字段和_id字段:
db.inventory.find( { type: "food", item:/^c/ },
{ item: 1 } )
请参阅创建支持覆盖查询索引的行为和使用的更多信息。