分布式Solr的排序及分页性能问题

本文介绍了一种针对分布式Solr排序和分页查询的优化算法。通过避免重复数据传输减少IO开销,并提出一种改进算法,使得在连续分页查询时能够显著降低数据传输量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分布式Solr的排序和分页使用下面的算法:
1. 传入查询条件q,排序sort,开始行数start,返回记录数rows
2. 修改参数,向各个分片shard发送新的查询请求:
   a)保持q和sort不变
   b)修改start=0,rows=原start+原rows
   c)分片shard将会返回最多(原start+原rows)行数据,并且是按照sort排序的
3. 合并每个shard返回的数据,并按sort排序
4. 截取[原start,原start+原rows-1]行数据,返回给前端


上面的算法中,shard每次都返回[0,原start+原rows-1]行数据,导致shard的IO开销特别大。
我们比较前端需要第n页和第n+1页的变化,可以知道:
第n+1页的数据中包含了第n页的数据,所以在剔除后,新的第n+1页数据的传输量就会显著下降。


算法改进:
0. 假设分页始终是递增的,即取第n页之后,才取第n+1页
1. 传入查询条件q,排序sort,开始行数start,返回记录数rows
2. 修改参数,向各个分片shard发送新的查询请求:
   a)保持q和sort不变
   b)获取该shard保留的上次最大序号ID,如果没有,则设为-1
   c)修改start=ID+1,rows=原start+原rows-ID-1
   d)分片shard将会返回最多(原start+原rows-ID-1)行数据,并且是按照sort排序的
   e)分片shard在结果集中返回shard名称
3. 合并每个shard返回的数据,并按sort排序
   a)先按sort排序,再按shard排序
   b)数据格式:shard,sort,id,序号,...
4. 截取[原start,原start+原rows-1]行数据,返回给前端
   a)按照shard,分组统计截取的数据
   b)更新每个shard保留的最大序号ID
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值