为什么mongodb不使用索引扫描,而是使用find()进行集合扫描?

时间:2019-12-26 14:15:10

标签: mongodb indexing

我正在使用mongodb 3.2.4

当我执行db.mytable.find().explain()时,获胜计划是“ Collscan”

但是当我执行db.mytable.find().hint(_id:1).explain()时,胜利的计划是'IXscan'

因此出现一个问题:由于_id是表的默认索引,为什么mongodb不使用该索引进行查询?

1 个答案:

答案 0 :(得分:0)

存在过滤条件或排序操作时可以使用索引-当索引中的字段用于过滤谓词和/或排序时。在您的情况下,find方法没有过滤条件或排序-因此没有使用索引,您可以在查询计划中将其视为集合扫描。 这是预期的。但是,当您向find方法提供 hint 时,查询优化器将尝试使用索引,而在您的情况下,索引确实使用了索引(并且在查询计划中将其视为IXSCAN)。无论哪种情况,无论有无提示,查找都必须扫描索引中的所有文档或键。

_id有一个默认的唯一索引,可以,但是除非您在查询过滤器谓词中使用_id字段或进行某种排序,否则查询将无法使用它(或显式指定为将索引与提示一起使用)。您可以使用以下查询(db.mytable.find( { _id: 123 } ) db.mytable.find( { } ).sort( { _id: -1 } )进行验证,即使您未指定提示,查询计划器也会显示索引扫描。 / p>

索引的主要目的是使查询快速运行;它与查询性能有关。它必须是具有过滤谓词的查询和/或使用索引的排序操作(并且必须对过滤或排序中使用的字段进行索引以提高性能)。在您的情况下,使用find方法时,您无需访问这两个文档中的任何一个,就可以像访问集合中的所有文档一样访问所有文档,并且索引没有用处(查询优化器在计划中已将其显示出来)。

相关问题