Sort operation used more than the maximum 33554432 bytes of RAM. Add an index, or specify a smaller
错误的产生
最近给公司部署mongodb来存储日志,自己在本地测试的好好的,上线后几天,有人反映说所有的日志都是6月20号的,我到后台看一下发现报了下面的错。
Query failed with error code 96 and error message Executor error during find command :: caused by :: errmsg
Sort operation used more than the maximum 33554432 bytes of RAM. Add an index, or specify a smaller limit
我去谷歌翻译了下(查询失败,错误代码为96,错误消息’查找命令::执行错误::排序操作使用超过最大33554432个字节的RAM。 添加索引或指定较小的限制)
错误原因
报错已经说的很清楚了,并且提供了两种解决办法:排序操作使用超过最大33554432个字节的RAM,添加索引或指定较小的限制。因为mongodb排序的时候会把数据加载到内存中,在这里排序的数据量太大导致超过了32M的默认排序内存。
我在程序里面根据id和createTime两个字段分页,在mongodb里相应的建立了复合索引。报错的解决方案之一是建立索引,就是说,我建立的复合索引,mongo没用!是不是很吃惊!
因为我们会建立很多索引,mongo在执行查询的时候会挑选一个最快的方案使用,很可惜id加createTime的复合索引落选了!导致的结果就是:不使用索引排序,直接加载数据到内存导致内存不足。
为了验证我的判断是正确的,我单独使用id或createTime排序,就没报错了!
错误解决
这个其实就是错误提示的两种方法:1,添加索引 2,加大内存
第一种方法是最好的,注意选择好索引字段,最好只使用一个字段做排序,不要给索引优化器出难题。
第二种方案不是很好,随着数据量增大,或着一页查出来100条数据,显然,加大内存并不是长久之计,这里不写修改内存的方法了。
参考:
https://blog.csdn.net/u012031380/article/details/74316259
https://blog.csdn.net/kdc18333608478/article/details/74635838
https://blog.csdn.net/cloume/article/details/70767061