1 deep-paging问题引入
有90个数字分布到三个分片上,每个分片上有30个数字。
shard1上:
1 、2、 3 、4 、5 、6 、7 、8、 9 、10 、11 、12 、13 、14、 15、 16、 17 、18、19 、20、 21、22、23、 24 、25 、26 、27、 28、 29 、30、
shard2上:
31 、32 、33 、34 、35 、36 、37 、38、 39 、40、 41 、42 、43、 44 、45 、46、 47 、48、 49、 50 、51 、52、 53、 54 、55 、56 57、 58、 59、 60 、
shard3上:
61、 62 、63 、64 、65 、66、 67 、68 、69 、70、 71 、72 、73、74 75、 76 、77 、78、 79 、80、81 、82、83、 84 、85、 86 、87、 88 、89、 90
假如查询第二页,然后每页15条。
是否可以每个分片上查询第二页,然后合在一起(3个shard一起45条)再排序,然后筛选15条?
答案是否定的。因为这不是topK问题,如果是topK则可以每个shard上取最大的15条,合在一起再取15条。
为什么答案是否定的,举个例子:
所以要想分页,只能每个分片上都取两页,再合起来排序,然后返回。这时问题就出现了,假如每页10条数据,我们想取第1000页。有3个分片,就需要每个分片取10010条数据合在一起,就会有30030条数据,然后排序。这无疑对带宽,内存,cpu都会造成压力,产生性能问题,会2-3秒后才返回。
2 解决
1 查询条数控制,不允许查询超过100页数据,如谷歌百度等最大允许查询100页
2 scoll滚动技术,会按批量返回,类似于游标
转载链接:https://blog.csdn.net/wabiaozia/article/details/105757540
附:
Solr 4.7 – efficient deep paging
https://solr.pl/en/2014/03/10/solr-4-7-efficient-deep-paging/