加入收藏 | 设为首页 | 会员中心 | 我要投稿 温州站长网 (https://www.52wenzhou.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

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

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

步骤五:既然得到了time_min在全局的offset,就相当于有了全局视野,根据第二次的结果集,就能够得到全局offset 1000 limit 5的记录

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

第二次查询在各个分库返回的结果集是有序的,又知道了time_min在全局的offset是994,一路排下来,容易知道全局offset 1000 limit 5的一页记录(上图中黄色记录)。

这种方法的优点是:可以精确的返回业务所需数据,每次返回的数据量都非常小,不会随着翻页增加数据的返回量。

帅气不帅气!!!

总结

今天介绍了解决“跨N库分页”这一难题的四种方法:

方法一:全局视野法

(1)SQL改写,将

  1. order by time offset X limit Y; 

改写成

  1. order by time offset 0 limit X+Y; 

(2)服务层对得到的N*(X+Y)条数据进行内存排序,内存排序后再取偏移量X后的Y条记录;

这种方法随着翻页的进行,性能越来越低。

方法二:禁止跳页查询法

(1)用正常的方法取得第一页数据,并得到第一页记录的time_max;

(2)每次翻页,将

  1. order by time offset X limit Y; 

改写成

  1. order by time where time>$time_max limit Y; 

以保证每次只返回一页数据,性能为常量。

方法三:允许模糊数据法

(1)SQL查询改写,将

  1. order by time offset X limit Y; 

改写成

  1. order by time offset X/N limit Y/N; 

性能很高,但拼接的结果集不精准。

方法四:二次查询法

(1)SQL改写,将

  1. order by time offset X limit Y; 

改写成

  1. order by time offset X/N limit Y; 

(2)多页返回,找到最小值time_min;

(3)between二次查询

  1. order by time between $time_min and $time_i_max; 

(4)设置虚拟time_min,找到time_min在各个分库的offset,从而得到time_min在全局的offset;

(5)得到了time_min在全局的offset,自然得到了全局的offset X limit Y;

文章比较长,希望大家有收获。

(编辑:温州站长网)

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

热点阅读