为什么mongodb不使用索引扫描,而是使用find()进行集合扫描?
我正在使用mongodb 3.2.4 当我执行为什么mongodb不使用索引扫描,而是使用find()进行集合扫描?,mongodb,indexing,Mongodb,Indexing,我正在使用mongodb 3.2.4 当我执行db.mytable.find().explain()时,获胜的计划是“Collscan” 但是当我执行db.mytable.find().hint(_id:1).explain()时,获胜的计划是“IXscan” 所以这里有一个问题:既然_id是表的默认索引,为什么mongodb不使用此索引进行查询?当存在筛选条件或排序操作时,可以使用索引-当索引中的字段用于筛选谓词和/或排序时。在您的例子中,find方法没有筛选条件或排序,因此没有使用索引,您可
db.mytable.find().explain()
时,获胜的计划是“Collscan”
但是当我执行db.mytable.find().hint(_id:1).explain()
时,获胜的计划是“IXscan”
所以这里有一个问题:既然_id是表的默认索引,为什么mongodb不使用此索引进行查询?当存在筛选条件或排序操作时,可以使用索引-当索引中的字段用于筛选谓词和/或排序时。在您的例子中,
find
方法没有筛选条件或排序,因此没有使用索引,您可以在查询计划中将其视为集合扫描。正如所料。但是,当您向find方法提供提示时,查询优化器会尝试使用索引,在您的例子中,它确实使用了索引(您在查询计划中将其视为IXSCAN)。在任何一种情况下,无论有无提示,查找都必须扫描索引中的所有文档或键
\u id
有一个默认的唯一索引,是的,但除非您在查询筛选器谓词或排序中使用\u id
字段,否则查询无法使用它(或者,显式指定使用带有提示的索引)。您可以通过以下查询进行验证,db.mytable.find({u id:123})
或db.mytable.find({}).sort({u id:-1})
即使您没有指定提示,查询计划器也将显示索引扫描
索引的主要目的是使查询运行得更快;这是关于查询性能的。它必须是带有筛选谓词的查询和/或排序操作,才能使用索引(筛选或排序中使用的字段必须为性能编制索引)。使用
find
方法,在您的情况下,如果没有这两个方法中的任何一个,您只需访问集合中的所有文档,索引没有任何用处(查询优化器在计划中显示了这一点)。因为它无论如何都必须扫描整个集合(您的查询中没有任何内容可以缩小搜索范围),所以首先进行索引扫描是额外的工作。我不知道mongodb如何在没有索引的情况下扫描整个集合。可能直接加载WiredTiger表?“除非您使用_id字段,否则查询无法使用它(在_id上的索引)”-相反,查询计划器没有理由使用索引。它可以,但它选择不这样做。:)