选择性是查询使用索引缩小结果范围的能力。有效索引更具选择性,并允许MongoDB将索引用于与执行查询相关的大部分工作。
为确保选择性,请编写带有索引字段的查询,以限制可能的文档数量。编写相对于索引数据具有适当选择性的查询。
例
假设您有一个名为的字段status
,可能的值是new
和processed
。如果添加索引,则status
创建的是低选择性索引。该索引对查找记录几乎没有帮助。
根据您的查询,一种更好的策略是创建一个包含低选择性字段和另一个字段的
复合索引。例如,您可以在status
和上创建复合索引created_at.
同样,根据您的用例,另一种选择可能是使用单独的集合,每种状态一个。
例
考虑一个
集合上的索引(即,键上的索引以升序排列),其中三个值在整个集合中均匀分布:{ a : 1 }
a
a
如果查询MongoDB,则必须扫描集合中的3个
文档以返回一个匹配的结果。同样,一个查询
必须扫描6个文档,还返回一个结果。{ a: 2, b: "no" }
{ a: { $gt: 1}, b: "tv" }
考虑一个集合上的相同索引,其中a
有9个值在整个集合中均匀分布:
如果您查询,则MongoDB必须仅扫描一个文档即可完成查询。索引和查询更具选择性,因为的值均匀分布,并且查询可以使用索引选择特定的文档。{ a: 2, b: "cd" }
a
但是,尽管on的索引a
更具选择性,但诸如的查询仍需要扫描4个文档。{ a: { $gt: 5 }, b: "tv" }
如果总体选择性很低,并且MongoDB必须读取许多文档以返回结果,那么某些查询在没有索引的情况下可能会执行得更快。要确定性能,请参阅 度量索引使用。