MongoDB explain("executionStats")索引过滤/排序用途判定技术问询
MongoDB 4.0中用
explain("executionStats")判断索引用途的关键元素 没问题,我来帮你梳理MongoDB 4.0里explain("executionStats")输出里能判断索引是否用于过滤、排序,或是两者兼用的核心元素——毕竟你提到旧版的explain字段已经在4.0里更新了,得抓对新的关键点:
1. 判断索引是否用于过滤
- 先定位到
executionStats.executionStages下的IXSCAN阶段(如果是嵌套执行计划,可能需要往内层inputStage找这个阶段):- 看
indexName:确认是不是你指定的目标索引。 - 看
keyPattern:如果和你创建的索引结构完全对应,说明这个索引正在被用来匹配查询条件做过滤。 - 对比
executionStats.executionStages.docsExamined和executionStats.totalDocsExamined:如果前者远小于后者,甚至为0(覆盖索引场景),说明索引帮你过滤掉了大部分无关文档,没有触发全表扫描。
- 看
2. 判断索引是否用于排序
- 核心看是否存在单独的
sortStage:如果输出里没有这个阶段,说明排序是直接通过索引完成的,MongoDB不需要在拿到过滤结果后再额外做内存/磁盘排序;如果有sortStage,那就是没用到索引排序,是事后做的排序。 - 辅助看
IXSCAN阶段的direction:比如你用sort({createdAt: -1}),如果direction显示backward,就对应上了排序方向,能佐证索引被用来排序。 - 另外看
IXSCAN的indexBounds:如果索引边界包含了排序字段的范围,且排序方向和索引定义一致,也能说明索引在承担排序工作。
3. 判断索引是否同时用于过滤和排序
当你看到以下特征同时出现时,就说明索引兼顾了过滤和排序:
IXSCAN阶段的keyPattern同时包含你的查询过滤字段和排序字段(符合复合索引的前缀规则,或者排序字段是索引的后续字段)- 输出里没有单独的
sortStage docsExamined的数值很小,说明索引既帮你过滤了文档,又直接返回了排序好的结果,不需要额外步骤。
举个实际例子:假设你创建了复合索引{status: 1, createdAt: -1},执行查询db.orders.find({status: "shipped"}).sort({createdAt: -1}).explain("executionStats"),如果IXSCAN的keyPattern和这个索引一致,且输出里找不到sortStage,那这个索引就是同时用来过滤和排序的。
内容的提问来源于stack exchange,提问作者gvphubli.blogspot.com
相关产品推荐
相关产品推荐

