Mongodb 排序导致内存不足

薄洪涛3年前数据库727

报错信息:


MongoDB.Driver.MongoQueryException: QueryFailure flag was Executor error: OperationFailed: Sort operation used more than the maximum 33554432 bytes of RAM. Add an index, or specify a smaller limit

报错页面很明显告知了问题排查的方向: - Sort operation 该页面涉及的MongoDB查询语句使用了排序。

  • more than the maximum 33554432 排序操作超过了MongoDB单个Session排序可使用的最大内存限制。

检索MongoDB的日志确实存在大量的查询报错,跟APP页面报错能够对应上;并且日志中排序使用的字段为add_time_id,升序排序

有两种解决方法

方法1:

增加内存

mongo 的 sort 操作是在内存中操作的,必然会占据内存,同时mongo内的一个机制限制排序时最大内存为 32M,当排序的数据量超过 32M,就会报上面的这个错,解决办法就像上面提示的意思,一是加大 mongo的排序内存,这个一般是运维来管,也有弊端,就是数据量如果再大,还要往上加


方法2:

增加索引

-1 倒序 1正序
db.getCollection('p_match_result').createIndex({"add_time": -1})

db.getCollection('p_match_result').getIndexes()

搞定

相关文章

CREATE TABLE 表名 AS SELECT 语句用法详解

新表不存在,创建新表1.创建新表并且携带数据create table new_table    as select *&...

Mysql实现主从复制

Mysql实现主从复制

在开始教程之前,必须要先说说为什么要搞主从复制线上环境,我们必须要对正式数据库的数据进行备份,保持备份数据库和正式库的数据实时一致业务层面:业务量越来越大,对数据库的查询越来越高,数据库服务器的压力越...

redis查找附近的人

Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。Redis GEO 操作方法有:geoadd:添加地理位置的坐标。geopos:获取地理位...

记录一次从日志中恢复mysql数据库数据

记录一次从日志中恢复mysql数据库数据

前因:有个大佬在update的时候,忘记加where条件,造成线上数据库中的某个状态值全部被修改,需要马上处理首先面对这种情况,我马上想到的就是从二进制日志文件中恢复,马上查看是否开启了日志,确定开启...

PostgreSQL不常用很有用的数据类型

PostgreSQL不常用很有用的数据类型

最近新项目开始,需要设计数据库,技术大佬用了很多我之前没见过的数据库数据类型,这里做个总结1.货币类型money类型存储固定小数精度的货币数字,表中展示的范围假设有两个小数位。可接受的输入格式很多,包...

mysql报错:1118 - Row size too large

mysql报错:1118 - Row size too large

前几天在建表的时候,有这么一个现象,因为我的表字段比较多(一个患者的体检表项目繁多,不要问我为什么不分表了),字段类型为varchar类型,结果保存的时候报了如下的错误原因:MySQL在建表的时候有个...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。