首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MongoDB -索引对只有findOne查询的集合有用吗?

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

Stack Overflow用户
提问于 2018-06-11 07:46:57
回答 1查看 823关注 0票数 0

我的问题找不到一个好的答案--你认为在一个只会运行findOne查询帮助的集合上的索引会提高性能吗?我知道索引是用来避免在运行find查询时扫描整个集合的。然而,在findOne查询中,索引提供了什么好处吗?

例如,在users集合中,假设它只有一个字段- username。对用户名进行索引是否会提高db.users.findOne({username: 'johndoe'})

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-11 08:08:07

是。如果您正在搜索单个字段,索引仍然会有所帮助。它们对于单个字段搜索非常有用,而不仅仅是复合搜索。

如果您希望避免创建索引,并且您的用户名是唯一的,则可以考虑使用用户名作为_id属性。如果您考虑这一点,请务必阅读有关分区和键分布的内容。

为了获得更高的性能,您可以在覆盖的查询中读取check out this information,这就要求您要检索的所有字段也被索引。MongoDB文档中的以下内容解释了这一点。

覆盖的查询

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

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

Performance

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

仅查询索引可能比查询索引外的文档快得多。索引键通常比它们所编目的文档小,并且索引通常在RAM中可用,或者按顺序位于磁盘上。

参考:https://docs.mongodb.com/manual/core/query-optimization/#covered-query

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

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

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

参考:https://dba.stackexchange.com/questions/7573/difference-between-mongodbs-find-and-findone-calls

以下是关于这些查询的讨论的一些附加信息:

参考:How to query MongoDB to test if an item exists?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50789008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档