查询计划

   MongoDB的查询优化器处理查询,并选择在给定可用的索引查询的最有效的查询计划。这个查询系统在每次查询运行的时候使用这个计划。
    查询优化器仅会高速缓存,可以有多个可行的查询计划来执行这些查询。
    查询优化器偶尔会重新评估查询计划作为集合的内容更改,以确保最佳的查询计划。您也可以指定索引的优化与索引筛选评估。
    您可以使用explain()方法来查看有关给定查询的查询计划统计,这些信息可以帮助你制定索引策略。

一、查询优化

要创建一个新的查询计划,查询优化器:

    1.针对几个在并行运行的候选索引的查询。
    2.在一个共同的结果缓冲区或缓冲区的匹配记录。
        如果候选计划仅包括有序的查询计划,这是一个单一的共同结果缓冲器。
        如果候选计划仅包括无序的查询计划,这是一个单一的共同结果缓冲器。
        如果候选计划包括有痛了查询计划和无序的查询计划,这是两种通用结果缓冲器,一个用于有序的计划,另一个用于无序的计划。
    如查一个索引的结果已经补别一个索引返回,优化处理器会跳过重复的匹配。在两个缓冲区的情况下,他们的数据是冗余的。
    3.当下列情况之一发生时,停止测试候选计划选择一个索引:
        一个无序的查询计划已返回所有匹配的结果;
        一个有序的查询计划已返回所有匹配的结果;
        一个有序的查询计划已返回匹配结果的阈值数:
            2.0版:阈值是查询批处理大小。缺省的批处理大小为101。
            2.2版:阈值是101。

选定的索引成为在查询计划中指定的索引;使用相同查询模式的查询的未来迭代将用这个索引。查询模式是指仅在值不同的查询选择条件下,如下面的两个查询具有相同的查询模式:

db.inventory.find( { type: 'food' } )
db.inventory.find( { type: 'utensil' } )

二、查询计划修订
集合是随着时间的变化,查询优化器在下列任何事件发生后删除查询计划并进行重新评估:
    集合收到1000个写操作。
    索引重新创建。
    你添加或删除索引。
    mongod进程重启。

三、缓存计划查询接口。
新版 2.6
MongoDB提供查询计划缓存方法到视图和修改缓存查询计划。

四、索引过滤器
新版 2.6
索引过滤器确定哪个索引优化评估一个查询方案。一个查询方案由查询、排序、特定映射组合构成。如果一个索引过滤器存在于一个指定的查询方案中,优化器只考虑在过滤器中指定的索引。


当一个索引过滤器对于一个查询方案存,MongoDB忽略hint().查看MongoDB中是否有适用索引过滤器的查询,检查 explain() 输出的explain.filterSet字段。

索引过滤器只影响这个索引的优化评估;对于一个给定的查询方案优化器可能仍然选择集合扫描为优胜方案。

索引过滤器在服务器进程的持续时间存在,关机后不会保留。MongoDB中还提供了一个命令来手动删除过滤器。

因为索引的过滤器覆盖了优化的预期行为,以及hint()方法,请慎用索引过滤器。

京ICP备14008139号-1