我有一个样本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,
}
...
}
我无法弄清楚为什么仅查询中的细微变化在性能上有如此大的差异?