今天有个需求是在 mongo 的报表 A 中查询数据,然后按照字段 a 排序返回数值。在数据量几百几千的时候还是很 ok 的。
但当数据量上升到十万左右的时候,执行时开始报错
sql
1 | com.mongodb.MongoQueryException: Query failed with error code 96 and error message 'Executor error during find command: OperationFailed: Sort operation used more than the maximum 33554432 bytes of RAM. Add an index, or specify a smaller limit.' on server |
原因比较明确,Sort operation used more than the maximum 33554432 bytes of RAM
, 33554432 bytes
正好回事 32MB。
mongo 的sort
操作是把数据拿到内存中在进行排序的,为了节省内存,默认给sort
操作限制了最大内存为32MB,所以当数据量越来越大,超过 32MB
的时候,就抛出异常了。
那对应的解决方案(但是这个方案,并不推荐使用),就是修改默认配置,多分配一点内存呗。在命令行执行:
sql
1 | db.adminCommand({setParameter:1, internalQueryExecMaxBlockingSortBytes:335544320}) //不推荐使用 |
来说一下正经推荐的方法 —— 建索引