我的问题找不到一个好的答案--你认为在一个只会运行findOne
查询帮助的集合上的索引会提高性能吗?我知道索引是用来避免在运行find查询时扫描整个集合的。然而,在findOne
查询中,索引提供了什么好处吗?
例如,在users集合中,假设它只有一个字段- username
。对用户名进行索引是否会提高db.users.findOne({username: 'johndoe'})
发布于 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?
https://stackoverflow.com/questions/50789008
复制相似问题