参考 > MongoDB CRUD操作 > MongoDB CRUD概念 > 查询优化
在本页面
索引通过减少查询操作需要处理的数据量来提高读取操作的效率。这简化了与在MongoDB中实现查询相关的工作。
如果您的应用程序查询特定字段或一组字段上的集合,则查询字段上的索引或该字段集上的复合索引可能会阻止查询扫描整个集合以查找并返回查询结果。有关索引的更多信息,请参阅MongoDB中索引的完整文档。
例
应用程序inventory
在type
现场查询集合
。该type
字段的值是用户驱动的。
要提高此查询的性能,请inventory
在type
字段的集合中添加升序或降序索引。[1]在mongo
外壳中,可以使用以下db.collection.createIndex()
方法创建索引:
该索引可以防止上面的查询type
扫描整个集合以返回结果。
除了优化读取操作外,索引还可以支持排序操作,并可以提高存储利用率。有关索引创建的更多信息,请参见
db.collection.createIndex()
和
索引。
[1] | 对于单字段索引,升序和降序之间的选择并不重要。对于复合索引,选择很重要。有关更多详细信息,请参见索引顺序。 |
查询选择性是指查询谓词排除或过滤出集合中文档的程度。查询选择性可以确定查询是否可以有效使用索引,甚至根本不使用索引。
更具选择性的查询与较小百分比的文档匹配。例如,唯一_id
字段上的相等匹配具有很高的选择性,因为它最多可以匹配一个文档。
选择性较低的查询与较大比例的文档匹配。选择性较低的查询不能有效地使用索引,甚至根本无法使用索引。
例如,不等操作符$nin
和
$ne
是不非常有选择性的,因为它们经常匹配索引的一大部分。结果,在许多情况下,带有索引的a $nin
或
$ne
查询的性能可能不如必须扫描集合中所有文档的a $nin
或$ne
查询更好
。
的选择性取决于表达式本身。有关详细信息,请参见正则表达式和索引使用。regular expressions
涵盖查询是可以完全使用索引满足的查询,而不必检查任何文档。当满足以下所有条件时,索引将 覆盖查询:
null
(即{ }或{ )。"field" : null
"field" : {$eq : null}}
例如,一个集合inventory
在type
和item
字段上具有以下索引
:
该索引将涵盖以下操作,该操作在type
和item
字段上查询
并仅返回该item
字段:
为了使指定的索引覆盖查询,投影文档必须明确指定从结果中排除该字段,因为该索引不包含该字段。_id: 0
_id
_id
在版本3.6中更改:索引可以涵盖对嵌入式文档中的字段的查询。 [2]
例如,考虑具有userdata
以下格式的文档的集合:
该集合具有以下索引:
该索引将涵盖以下查询:{ "user.login": 1 }
[2] | 要为嵌入式文档中的字段建立索引,请使用点符号。 |
从3.6开始,如果索引跟踪哪个或哪些字段导致索引成为多键,则多键索引可以覆盖非数组字段的查询。在MongoDB 3.4或更高版本中在MMAPv1以外的存储引擎上创建的多键索引会跟踪此数据。
多键索引不能覆盖对数组字段的查询。
由于索引包含查询所需的所有字段,因此MongoDB既可以匹配查询条件 ,也可以仅使用索引返回结果。
仅查询索引比查询索引之外的文档要快得多。索引键通常比它们所分类的文档小,并且索引通常在RAM中可用,或者顺序位于磁盘上。
explain
¶要确定查询是否为涵盖查询,请使用
db.collection.explain()
或explain()
方法,然后查看结果。
db.collection.explain()
提供有关其他操作执行的信息,例如db.collection.update()
。有关db.collection.explain()
详细信息,请参见
。
有关更多信息,请参见度量索引使用。