查询执行计划选复合索引时,排序字段A的单独索引是否会被使用?
MongoDB索引排序相关问题解答
问题1:如果某索引未被选为查询的最优执行计划,该查询是否仍可使用该索引对字段进行排序?
不会。MongoDB的查询优化器一次只会选择一个索引来完成整个查询流程(包括过滤和排序),不会拆分任务分别使用多个索引。如果某个索引没被选为最优执行计划,说明优化器判定它在整体执行效率上不如选中的索引,自然不会再调用它来处理排序步骤。
举个实际场景:假设你有两个索引,一个专门优化查询过滤条件,另一个针对排序字段设计。优化器会评估哪个索引能同时满足过滤+排序的整体成本更低,最终只会二选一。如果选中了过滤效率更高的索引,排序操作就会在内存中完成(若结果集超出内存限制则会报错),不会再启用那个排序专用的索引。
问题2:我拥有一个复合索引和一个字段A的单独索引,当find查询选用复合索引作为最优执行计划且结果按字段A排序时,字段A的单独索引是否会被用于排序?
不会。MongoDB单次查询只会依赖一个索引执行。既然已经选定复合索引作为最优执行计划,排序要么依托该复合索引的结构完成(比如复合索引的前缀或后缀包含字段A且符合排序规则),要么就在内存中完成排序,完全不会用到字段A的单独索引。
举个例子:如果复合索引是{B:1, C:1},你的查询通过B字段过滤结果,再按A字段排序,那么复合索引仅能完成过滤环节,排序只能在内存中处理,不会调用{A:1}的单独索引。只有当优化器判定单独索引配合过滤的整体执行成本低于复合索引时,才会选择单独索引,但此时就不会再使用复合索引了。
内容的提问来源于stack exchange,提问作者Bear Bile Farming is Torture
相关产品推荐
相关产品推荐

