背景:日志监控发现有段操作MongoDB的代码执行时频繁报错:
Sort operation used more than the maximum 33554432 bytes of RAM. Add an index, or specify a smaller limit.
查看对应的query后发现是对较大数据量进行了排序操作,而对于未加索引的字段进行排序会使DB全量将字段读入内存,从而导致MongoDB用于排序的缓存区被填满,刚好使用的MongoDB版本默认缓存为32M(4.3以上版本默认是100M),诱发了这一问题。
两个解决方案:
增加缓存大小
db.adminCommand({
setParameter: 1,
internalQueryExecMaxBlockingSortBytes: 104857600
})
针对query语句为排序字段添加索引
db.SampleCollection.createIndex({
"SampleField": 1
});
这里需要特别注意,联合索引的字段需要和查询语句中的排序字段完全一致才可以命中。