You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:33:52