无法为我的问题找到一个好的答案 - 您认为仅运行findOne
查询的集合上的索引有助于提高性能吗?我知道索引用于避免在运行查询时扫描整个集合。但是,在findOne
查询中,索引是否提供了任何好处?
例如,在用户集合中,我们假设它只有一个字段 - username
。用户名上的索引会改善db.users.findOne({username: 'johndoe'})
吗?
答案 0 :(得分:1)
是。如果您搜索单个字段,索引仍然有用。它们对单场搜索很有用,而不仅仅是复合搜索。
如果您想避免创建索引,并且username
是唯一的,则可以考虑使用用户名作为_id
属性。如果您考虑到这一点,请务必阅读分区和密钥分发。
为了获得更高的性能,您可以阅读有关涵盖查询的详细信息,这样您还需要检索所有要检索的字段。 MongoDB的文档中的以下内容解释了这一点。
涵盖查询
覆盖查询是一个可以完全使用索引来满足的查询,而不必检查任何文档。当满足以下两个条件时,索引将涵盖查询:
- 查询中的所有字段都是索引的一部分,
- 结果中返回的所有字段都在同一索引中。
<强>性能强>
因为索引包含查询所需的所有字段,所以MongoDB可以匹配查询条件并仅使用索引返回结果。
仅查询索引可能比查询索引之外的文档快得多。索引键通常小于它们编目的文档,索引通常可以在RAM中使用,也可以按顺序放在磁盘上。
值得注意的是,如果您只想检查记录是否存在,find().limit(1)
明显快于findOne
,因为find().limit(1)
会返回光标,findOne()
会读取文档,将其返回给您,如果记录存在则关闭光标。使用find().limit(1)
时,不会执行任何查询,因此您需要执行其他操作来启动size()
或count(true)
等查询。
以下是MongoDB工程师的一些信息:
您正在执行的两个查询非常不同。 find查询返回一个游标,这实际上是一个无操作的场景,因为没有返回实际数据(只有游标信息)。如果你调用findOne,那么你实际上是返回数据并关闭光标。文档应该更清楚: - )
讨论这些查询的一些其他信息: