插入图片就报错,profiler在生产也截不出来,只能口述一下请各位大佬解惑了。
目前有一个索引A是{‘a’:1,’duration’:1,’time’:-1},还有一个索引B是{‘a’:1,’c’:1,’d’:1,’time’:-1}以及C是{‘a’:1,’e’:1,’f’:1,’g’:1,’time’:-1}
此时我的查询语句为find({‘a’:’1234′,’duration’:{$gte:200},’time’:{$gte:ISODate(‘2022-01-01’)}}).sort({‘time’:-1})
我的预期是使用索引A,但是实际上使用的B或者C。请问各位大佬这是因为什么呢
我的查询语句是
db.collection.find({“business_fields.center_id”:”8629″,
“recordDuration”:{$gte:600},
“business_fields.dial_starttime”:{$gte:ISODate(“2021-12-01”)}
}).sort({“business_fields.dial_starttime”:-1})
WinningPlan命中的索引是
{“business_fields.center_id”:1,
“business_fields.list_type”:1,
“business_fields.list_detail”:1,
“business_fields.dial_starttime”: -1}
RejectedPlan命中的索引是
{“business_fields.center_id”:1,
“recordDuration”:1,
“business_fields.dial_starttime”: -1}
涉及字段的数据结构是这样的
{”xxx”:”xxx”,
“recodDuration”: 996,
“business_fields”:{“xxx”:”xxx”,
“center_id”:”8629″,
“dial_starttime”:ISODate(“2021-12-25”)
“list_type”:”XIV”,
“list_detail”:”XII”,
“XXX”:”XXX”
},
“XXX”:”XXX”
}
理论上来说应该选A,如果从ESR角度来说,{‘a’:1,’time’:-1,’duration’:1}这个索引更合适。
但是从ABC3个索引来看,A确实是更合适的。至于说预期没有达到的话,你可以发个
db.aa.explain(“executionStats”).find({‘a’:’1234′,’duration’:{$gte:200},’time’:{$gte:ISODate(‘2022-01-01’)}}).sort({‘time’:-1})来看看。
当然也存在优化器BUG或者估算错误的情况。你可以尝试清理执行计划重新解析看下。能否达到最佳。
这里不知道为什么放截图就报错,我在思否上也提了这个问题,那边能放图,能否麻烦移步看一下呢https://segmentfault.com/q/1010000041264801