On this page
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()方法的预期行为,所以请谨慎使用索引过滤器。
参见planCacheListFilters,planCacheClearFilters和planCacheSetFilter。