Query Plans

在本页面

MongoDB 查询优化器处理查询,并在给定可用索引的情况下为查询选择最有效的查询计划。然后,查询系统将在每次查询运行时使用此查询计划。

查询优化器仅缓存那些具有多个可行计划的查询形状的计划。

对于每个查询,查询计划者都会在查询计划缓存中搜索适合query shape的条目。如果没有匹配的条目,查询计划器将生成候选计划,以在试用期内进行评估。查询计划者选择一个中奖计划,创建一个包含中奖计划的缓存条目,然后使用它来生成结果文档。

如果存在匹配的条目,则查询计划程序将基于该条目生成计划,并通过replanning机制评估其性能。该机制根据计划性能做出pass/fail决策,并保留或逐出缓存条目。逐出时,查询计划者将使用常规计划过程选择一个新计划并将其缓存。查询计划者执行计划并返回查询的结果文档。

下图说明了查询计划程序逻辑:

查询计划程序逻辑图

有关触发对计划缓存的更改的其他方案,请参见计划缓存刷新

您可以使用db.collection.explain()cursor.explain()方法查看有关给定查询的查询计划的统计信息。开发indexing strategies时,此信息可以提供帮助。

db.collection.explain()提供有关其他操作的执行信息,例如db.collection.update()。有关详细信息,请参见db.collection.explain()

在 2.6 版中进行了更改:explain()操作不再从查询计划程序缓存中读取或写入。

计划缓存刷新

索引或收集删除之类的目录操作会刷新计划缓存。

如果mongod重新启动或关闭,则计划缓存将不会保留。

2.6 版的新功能:MongoDB 提供查询计划缓存方法来查看和修改缓存的查询计划。 PlanCache.clear()方法刷新整个计划缓存。用户还可以使用PlanCache.clearPlansByQuery()清除特定的计划缓存条目。

Index Filters

2.6 版的新功能。

索引过滤器确定优化器为query shape评估的索引。查询形状由查询,排序和投影说明的组合组成。如果给定查询形状存在索引过滤器,那么优化器仅考虑过滤器中指定的那些索引。

当查询形状存在索引过滤器时,MongoDB 会忽略hint()。要查看 MongoDB 是否对查询形状应用了索引过滤器,请检查db.collection.explain()cursor.explain()方法的indexFilterSet字段。

索引过滤器仅影响优化器评估的索引;对于给定的查询形状,优化器仍然可以选择将集合扫描作为获胜计划。

索引过滤器在服务器进程的持续时间内存在,并且在关闭后不会持续存在。 MongoDB 还提供了手动删除过滤器的命令。

因为索引过滤器会覆盖优化器和hint()方法的预期行为,所以请谨慎使用索引过滤器。

参见planCacheListFiltersplanCacheClearFiltersplanCacheSetFilter