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

  • 相关阅读:
    NYIST 46 最少乘法次数
    OpenSSL命令---rsa
    Javah生成JNI头文件
    Stbdroid之ShapeDrawable
    Android之判断设备网络连接状态,并判断连接方式
    [置顶] 程序员必知(二):位图(bitmap)
    中断子系统8_软中断入口处理
    二叉搜索树的后续遍历序列
    整理生命
    sicily9162. RAZLIKA
  • 原文地址:https://www.cnblogs.com/paper-man/p/13284760.html
Copyright © 2011-2022 走看看