假设当前有一个场景需要查询10010 ~ 10015的学生。
不同于单机数据库只需要select * from order 然后再limit一下就行
ES的集群环境下,因为分片分配策略的原因,分片肯定是分配在多个不同节点下的,我们会从多个节点下把那些分片里的所有数据都拿出来,假设一共有5W条数据,我们全拿出来,然后进行排序,再取其中10010 ~ 10015的学生,进行返回,这就是深度分页的问题。
这个问题出现的原因是你需要查询出内存中的所有分片数据,在内存中进行一个分页,这个对内存的损耗是很大的,严重时,频繁的分页还会导致FULL GC的出现,所以ES默认也设置了10000的阈值,来防止用户不了解底层原理使得深度分页情况的发生。
我们需要尽量尝试避免深度分页的出现
可以在产品层面上进行规避
比如淘宝的解决手段 只返回100页,每页100条记录,刚好卡在ElasticSearch的最大阈值上.