zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    idea主题更换pycharm/intellij
    随机生成n张扑克牌。
    JAVA生成6个1-8的随机数,要求无重复。
    一道简单 的循环
    linux虚拟机互访
    linux中grep命令
    vi和vim编辑器
    文件压缩打包以及备份
    文件内容查询
    目录相关操作
  • 原文地址:https://www.cnblogs.com/paper-man/p/13284760.html
Copyright © 2011-2022 走看看