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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值