Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么mongodb不使用索引扫描,而是使用find()进行集合扫描?_Mongodb_Indexing - Fatal编程技术网

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

为什么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方法没有筛选条件或排序,因此没有使用索引,您可

我正在使用mongodb 3.2.4

当我执行
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上的索引)”-相反,查询计划器没有理由使用索引。它可以,但它选择不这样做。:)