查询条件是:
“filter”:{
“dialogboxowner”:”chenxue”,
“msgtime”:{
“$gte”:”1687163400000″,
“$lt”:”1689754746428″
},
“isexternal”:1,
“isgroup”:0
}
exeStatus:(截取了部分)
“docsExamined”:47416,
“cursorExhausted”:true,
“numYield”:126,
“nreturned”:22,
“locks”:{
“ReplicationStateTransition”:{
“acquireCount”:{
“w”:1
}
},
“Global”:{
“acquireCount”:{
“r”:128
}
},
“Mutex”:{
“acquireCount”:{
“r”:1
}
}
“storage”:{
“data”:{
“bytesRead”:14742255,
“timeReadingMicros”:9404697
}
}
“planSummary”:”COLLSCAN”,
“execStats”:{
“stage”:”COLLSCAN”,
“filter”:{
“$and”:[
{
“dialogboxowner”:{
“$eq”:”chenxue”
}
},
{
“isexternal”:{
“$eq”:1
}
},
{
“isgroup”:{
“$eq”:0
}
},
{
“msgtime”:{
“$lt”:”1689754746428″
}
},
{
“msgtime”:{
“$gte”:”1687163400000″
}
}
]
},
“nReturned”:22,
“executionTimeMillisEstimate”:9401,
“works”:47418,
“advanced”:22,
“needTime”:47395,
“needYield”:0,
“saveState”:126,
“restoreState”:126,
“isEOF”:1,
“direction”:”forward”,
“docsExamined”:47416
}
表中有两个索引,主键索引和查询条件的组合索引,数据总量在5w条左右
问题在于:个别请求的耗时特别长,大部分的请求时间都是快的;
你这个执行计划是COLLSCAN,都没有走索引的。
扫描47416返回22条,创建一个索引应该可以解决。根据查询条件创建组合索引即可。因为不知道数据分布如何。
db.xxx.createIndex({dialogboxowner:1,msgtime:1})
或者
db.xxx.createIndex({dialogboxowner:1,isexternal:1,isgroup:1,msgtime:1})
“dialogboxowner”:”chenxue”,
“msgtime”:{
“$gte”:”1687163400000″,
“$lt”:”1689754746428″
},
“isexternal”:1,
“isgroup”:0
“dialogboxowner”:”Heipengfei”,
“msgtime”:{
“$gte”:”1658232870642″,
“$lt”:”1690460068583″
},
“isexternal”:1,
“isgroup”:0
这是一个查询的例子,数据库有两个索引,一个是id主键,另外是这4个字段的组合索引,经常出现的情况是时快时慢?并且慢的查询也是有用到索引的