目录
一、问题背景描述
1.1、问题背景
现实系统页面翻页到20000页之后,出现异常报错。
caused by :: Sort operation used more than the maximum 67108864 bytes of RAM.
经过排查分析,Sort操作超过了MongoDB单个Session排序可使用的最大内存限制。这里针对Sort排序支持的最大内存限制是64M。
1.2、问题分析
经过排查,sort排序的字段未使用到索引,sort时触发内存限制而报错。对此,我们解决问题思路如下:
(1).调整sort排序时内存限制;
(2).给要查询的字段创建合适的索引;
(3).对于复杂多变的查询场景,无法创建所有的索引,有什么其他办法解决?
二、建立索引支持深度翻页查询
2.1、调整sort排序的内存限制【不建议】
# 比如调大到 128M
## 在线调整
> db.adminCommand({
setParameter:1, internalQueryExecMaxBlockingSortBytes:134217728})
## 持久到配置文件
setParameter:
internalQueryExecMaxBlockingSortBytes: 134217728
2.2、创建索引
如果查询语句的排序是单列排序,那么直接加索引即可,(升序/降序)排序规则无影响。
如果查询的排序是使用组合排序,那么需要建立合适的索引。
//-1:表示降序 1:表示升序
@CompoundIndex(name = “un_index_a_b”, def = “{a:1,b:-1}”, unique = true)
@CompoundIndex(name = “un_index_a_b”, def = “{a:1,b:1}”)
上面是我们常见创建的组合索引,设定字段升序或降序。可以使用explain()方法来判断是否使用了索引。这样针对具体问题,创建合适的索引,能够解决一些问题。
创建索引的语句如下:
db.wwy_table.dropIndex("a_1_b_-1");
db.wwy_table.createIndex(
{
a: 1,
b: -1
},
{
name: "un_index_a_b"
}
);
------经过测试,建立合适的索引并且语句执行使用了索引,查询没问题。
2.3、拓展–组合索引什么时候失效
现有wwy_table表,有索引@CompoundIndex(name