加入收藏 | 设为首页 | 会员中心 | 我要投稿 西安站长网 (https://www.029zz.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

炸!业界难题,跨库分页的几种常见方案

发布时间:2019-05-15 06:37:49 所属栏目:建站 来源:58沈剑
导读:副标题#e# 为什么需要研究跨库分页? 互联网很多业务都有分页拉取数据的需求,例如: 微信消息过多时,拉取第N页消息; 京东下单过多时,拉取第N页订单; 浏览58同城,查看第N页帖子; 这些业务场景对应的消息表,订单表,帖子表分页拉取需求,都有这样一些共同

缺点显而易见:

  • 每个分库需要返回更多的数据,增大了网络传输量(耗网络);
  • 除了数据库按照time进行排序,服务层还需要进行二次排序,增大了服务层的计算量(耗CPU);
  • 最致命的,这个算法随着页码的增大,性能会急剧下降,这是因为SQL改写后每个分库要返回X+Y行数据:返回第3页,offset中的X=200;假如要返回第100页,offset中的X=9900,即每个分库要返回100页数据,数据量和排序量都将大增,性能平方级下降。

“全局视野法”虽然性能较差,但其业务无损,数据精准,不失为一种方案,有没有性能更优的方案呢?

“任何脱离业务的架构设计都是耍流氓”,技术方案需要折衷,在技术难度较大的情况下,业务需求的折衷能够极大的简化技术方案。

方案二:禁止跳页查询法

在数据量很大,翻页数很多的时候,很多产品并不提供“直接跳到指定页面”的功能,而只提供“下一页”的功能,这一个小小的业务折衷,就能极大的降低技术方案的复杂度。

炸!业界难题,跨库分页的几种常见方案

如上图,不能跳页,那么第一次只能够查第一页:

(1)将查询

  1. order by time offset 0 limit 100; 

改写成

  1. order by time where time>0 limit 100; 

(2)上述改写和offset 0 limit 100的效果相同,都是每个分库返回了一页数据(上图中粉色部分);

炸!业界难题,跨库分页的几种常见方案

(3)服务层得到2页数据,内存排序,取出前100条数据,作为最终的第一页数据,这个全局的第一页数据,一般来说每个分库都包含一部分数据(如上图粉色部分);

这个方案也需要服务器内存排序,岂不是和“全局视野法”一样么?第一页数据的拉取确实一样,但每一次“下一页”拉取的方案就不一样了。

点击“下一页”时,需要拉取第二页数据,在第一页数据的基础之上,能够找到第一页数据time的最大值:

炸!业界难题,跨库分页的几种常见方案

这个上一页记录的time_max,会作为第二页数据拉取的查询条件:

(1)将查询

  1. order by time offset 100 limit 100; 

(编辑:西安站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读