首页 > 解决方案 > 在 MongoDB 中将排序顺序从升序更改为降序时查询性能下降

问题描述

我有一个Test包含近 100 万条数据的样本集合,其中的样本如下:

{
    data:[
        {
           property: 'firstName',
           value: 'Robins' 
        },
        {
           property: 'position',
           value: 6000
        }
    ],
    dataObj:{
        firstName: 'Robins',
        position: 6000
    }
}

//indexes
1. db.Test.createIndex({ "data.property": 1, "data.value":1 })
2. db.Test.createIndex({ "dataObj.position": 1 })

我在这里的两个不同查询中获得了不同的性能:

查询 1

查询位置 <= 6000 并按ascending位置顺序排序

db.Test.find({ 
   'data': {
      $elemMatch: { property: 'position', value: { $lte: 60000 } }
   }  
 }).limit(10).sort({ 'dataObj.position': 1 }).explain("executionStats");

查询 2

查询位置 <= 6000 并按descending位置顺序排序

db.Test.find({
 'data': {
   $elemMatch: { property: 'position', value: { $lte: 60000 } }
  }  
}).limit(10).sort({ 'dataObj.position': -1 }).explain("executionStats");

查询 1 执行统计

{
   ...
   "executionStats" : {
       "executionSuccess" : true,
       "nReturned" : 10,
       "executionTimeMillis" : 2,
       "totalKeysExamined" : 30,
       "totalDocsExamined" : 30,
   }
   ...
}

查询 2 执行统计

{
   ...
   "executionStats" : {
       "executionSuccess" : true,
       "nReturned" : 10,
       "executionTimeMillis" : 4323,
       "totalKeysExamined" : 167327,
       "totalDocsExamined" : 167327,
   }
   ...
}

我无法弄清楚为什么只有查询中的微小变化而在性能上有如此大的差异?

标签: mongodbmongoosemongodb-query

解决方案


推荐阅读