mongodb 这个$sort和$limit查询会使用索引还是在内存中阻塞排序?

5tmbdcev  于 2023-08-04  发布在  Go
关注(0)|答案(1)|浏览(97)

联系方式:

{
  last_logged_in: -1
}

字符串
查询:

user.aggregate([
  {
    $match: {
      age: { $gt: 18 },
      city: { $in: ["chicago", "paris"] }
    }
  },
  {
    $sort: {
      last_logged_in: -1
    }
  },
  {
    $limit: 10000
  }
])


它基于不属于索引的字段进行匹配,但$sort是根据索引字段进行的。
此查询是否需要内存中排序?

qnakjoqk

qnakjoqk1#

解释输出将向您显示该索引可用于:

{
  stage: 'LIMIT',
  limitAmount: 10000,
  inputStage: {
    stage: 'FETCH',
    filter: {
      '$and': [
        { age: { '$gt': 18 } },
        { city: { '$in': [ 'chicago', 'paris' ] } }
      ]
    },
    inputStage: {
      stage: 'IXSCAN',
      keyPattern: { last_logged_in: -1 },
      indexName: 'last_logged_in_-1',
      isMultiKey: false,
      multiKeyPaths: { last_logged_in: [] },
      isUnique: false,
      isSparse: false,
      isPartial: false,
      indexVersion: 2,
      direction: 'forward',
      indexBounds: { last_logged_in: [ '[MaxKey, MinKey]' ] }
    }
  }
}

字符串
缺少专用的SORT阶段表明索引正在提供排序。也就是说,您会注意到扫描没有边界(请参见indexBounds)。因此,该索引对查询的有效性完全取决于$match中 predicate 的选择性。如果它是高度非选择性的,那么索引将是有用的。它的选择性越强,索引的有效性就越低。
您可以改为考虑遵循the ESR guidance。在您的情况下,这意味着要创建以下索引:

{ city: 1, last_logged_in: -1, age: 1 }


我希望这个索引在这个查询中的性能比您所引用的单个字段索引要好。

相关问题