MongoDB - 对只有findOne查询的集合有用的索引吗?

时间:2018-06-10 23:46:57

标签: mongodb indexing nosql

无法为我的问题找到一个好的答案 - 您认为仅运行findOne查询的集合上的索引有助于提高性能吗?我知道索引用于避免在运行查询时扫描整个集合。但是,在findOne查询中,索引是否提供了任何好处?

例如,在用户集合中,我们假设它只有一个字段 - username。用户名上的索引会改善db.users.findOne({username: 'johndoe'})吗?

1 个答案:

答案 0 :(得分:1)

是。如果您搜索单个字段,索引仍然有用。它们对单场搜索很有用,而不仅仅是复合搜索。

如果您想避免创建索引,并且username是唯一的,则可以考虑使用用户名作为_id属性。如果您考虑到这一点,请务必阅读分区和密钥分发。

为了获得更高的性能,您可以阅读有关涵盖查询的详细信息,这样您还需要检索所有要检索的字段。 MongoDB的文档中的以下内容解释了这一点。

  

涵盖查询

     

覆盖查询是一个可以完全使用索引来满足的查询,而不必检查任何文档。当满足以下两个条件时,索引将涵盖查询:

     
      
  • 查询中的所有字段都是索引的一部分,
  •   
  • 结果中返回的所有字段都在同一索引中。
  •   
     

<强>性能

     

因为索引包含查询所需的所有字段,所以MongoDB可以匹配查询条件并仅使用索引返回结果。

     

仅查询索引可能比查询索引之外的文档快得多。索引键通常小于它们编目的文档,索引通常可以在RAM中使用,也可以按顺序放在磁盘上。

值得注意的是,如果您只想检查记录是否存在,find().limit(1)明显快于findOne,因为find().limit(1)会返回光标,findOne()会读取文档,将其返回给您,如果记录存在则关闭光标。使用find().limit(1)时,不会执行任何查询,因此您需要执行其他操作来启动size()count(true)等查询。

以下是MongoDB工程师的一些信息:

  

您正在执行的两个查询非常不同。 find查询返回一个游标,这实际上是一个无操作的场景,因为没有返回实际数据(只有游标信息)。如果你调用findOne,那么你实际上是返回数据并关闭光标。文档应该更清楚: - )

讨论这些查询的一些其他信息: