查询计划(Query Plans)
在给定可用索引的情况下,MongoDB查询优化器处理查询并且选择出针对某查询而言高效的查询计划。每次查询执行的时候,查询系统都会使用该查询计划。
查询优化器仅缓存那些有多个可行计划的 query shape。
对于每个查询,查询计划程序在查询计划缓存中搜索适合 query shape 的查询计划。如果没有匹配到合适的查询计划,则查询计划程序会生成候选计划,以便在试用期内进行评估。查询计划程序选择获胜计划,创建包含获胜计划的缓存条目,并使用它来生成结果文档。
如果存在匹配条目,则查询计划程序将根据该条目生成计划,并通过重新计划机制评估其性能。 此机制根据计划性能进行通过/失败决策,并保留或逐出缓存条目。 在逐出时,查询计划程序使用常规计划过程选择新计划并对其进行缓存。 查询计划程序执行计划并返回查询的结果文档。
下图阐述查询计划逻辑:
有关触发计划缓存更改的其他方案,请参阅计划缓存刷新。
你可以使用 db.collection.explain() 或 cursor.explain() 方法展示给定查询的查询计划相关统计信息。在制定索引策略时,此信息可以提供帮助。
在2.6版中更改:explain() 操作不再读取或写入查询计划程序缓存。
计划缓存刷新(Plan Cache Flushes)
索引或集合等目录操作会刷新计划缓存。
mongod 重启或关闭计划缓存(会丢失)将不会被留存。
新版本2.6中:MongoDB 提供 查询计划缓存方法显示及修改已缓存的计划。 PlanCache.clear() 方法刷新所有的计划缓存。用户也可以使用 PlanCache.clearPlansByQuery()清除指定的计划缓存
索引过滤器(Index Filters)
索引过滤器确定优化程序为 query shape 评估的索引。query shape 由 query,sort 和 projection 的组合组成。 对于给定 query shape 如果存在索引过滤器,则优化程序仅考虑过滤器中指定的那些索引。
当 query shape 存在索引过滤器时,MongoDB 会忽略 hint()。查询MongoDB为 query shape 是否使用了索引过滤器,检查 db.collection.explain() 或 cursor.explain() 方法的 indexFilterSet (boolean 类型)字段。
索引过滤器仅影响优化程序评估的索引; 优化器仍然可以选择集合扫描作为给定 query shape 的获胜计划。
索引过滤器在服务器进程的持续时间内存在,并且在关闭后不会保留。 MongoDB还提供了手动删除过滤器的命令。
由于索引过滤器会覆盖优化程序的预期行为以及hint() 方法,因此请谨慎使用索引筛选器。
planCacheListFilters
列出与集合 query shape 有关联的索引过滤器。语法格式如下:
db.runCommand( { planCacheListFilters: <collection_name> } )
相关文章