分库分表下,如何实现分页查询功能?
创始人
2026-06-29 14:46:14
0

随着互联网的飞速发展,大公司的业务数据也爆发式增长。由于业务数据不断的增加,数据库的压力也是越来越大,单表数量上亿条也是很常见的常见,如订单数据、物流数据。

为了应对这些大数据量的场景,常见的解决方案是分库分表,即就是将数据分散存储到不同的库或表中来有效地提高数据库的读写性能,从而实现更好地支撑实际的公司业务。

分库分表虽然可以解决单表数量过大的问题,同时它也带来了新的问题,典型的如业务数据的分页查询,下面我们分析数据水平切分下的分页查询实现的方案。

一、分库分表下分页查询问题的根源

假设现在采用通过订单id取模的策略将订单数据分布到两个不同的库(database_0与database_1)上,如下图所示:

通过上述的操作之后,每个数据库都失去了“全局视野”,如下图所示的单个表中的数据:

在单表下,假设需求是每页展示3条数据,然后我们查询第2页的数据时,我们通过简单的sql查询就可以实现,sql如下所示:

select * from order order by create_time asc limit 3,3

此时我们就可以查询到第2页的数据是id=4和id=5的数据。但是通过id取模之后数据分布在不同的库中,如下所示:

这个时候id=4和id=5的数据分布在不同的库上,此时如果每一个库上都通过select * from order order by create_time asc limit 3,3 分页查询的话就得不到数据了,那么就出现了分库分表下的分页查询问题。

二、全局查询法

为了解决分库分表下分页查询问题,我们采用全局查询法来解决这个问题。首先我们可以思考一下,分库分表后需要查询的数据分布情况:

1、分页数据均匀在两个库中

如果两个库的数据完全相同,此时只需要每个库各取一半后再取半页数据,最终就是我们想要的数据,如下图所示:

2、查询的结果在同一个库中

两个库的数据分布不均衡,此时我们要查询的数据在分布某一个库中,如下图所示的:

3、查询的结果在两个库中

两个库的数据分布相对均衡,此时我们要查询的数据在分布在两个库中,如下图所示的:

通过上述的分析得出分库分表下,我们要分页查询的数据由于不清楚到底是上述的哪种情况,所以在查询第2页数据的时候,我们必须要每个库都返回2页数据,这样得到的4页数据,然后在服务层进行内存排序,得到数据全局视野,再取第2页数据,便能够得到想要的全局分页数据,原理如下所示:

  • 全局查询法方案优点:

通过服务层修改sql语句,扩大数据查询的范围进而能够得到全局视野数据,这样不仅业务数据全而且可以精准返回所需数据。

  • 全局查询法方案缺点:

每个分库需要返回更多的数据,增大了网络传输量;数据查询到后需要服务层进行二次排序,增大了服务层的计算量。同时,随着查询翻页的页码增大,出现深度分页的问题。

三、全局查询法的优化方案——禁止跳页法

全局查询法虽然性能较差,但是其业务数据无损查询,数据精准,缺点是它的性能不稳定,随着翻页越深,性能越差。

市面上很多的产品中,他是不提供“直接跳到指定页面”的功能,而只提供“下一页”的功能,这一个小小的业务折衷,就能极大的降低技术方案的复杂度。我们也可以借鉴这种思想来优化全局查询法,假设现在不允许跳页,那么第一次只能够查第一页,分别在两个库中查询第一页的数据,然后记住第一页的最大id,查询第2页的时候带上第1页的最大id继续向后查询,如下图所示:

禁止跳页法可以有效的提升全局查询法的效率。

总结:

1、全局查询法可以实现业务数据无损查询,数据精准,但是存在深度分页的问题。

2、业务允许的情况下我们可以使用禁止跳页法来优化全局查询法。

3、可以借助ES等中间件来存储数据,从而实现更多的功能,但是也要注意ES的深度分页和数据同步的问题。

4、使用ShardingSphere,它提供了一些内置的分页优化(如自动改写SQL+全局查找法+流式处理【排序,过滤)】)

5、如果业务允许的情况下,我们只提供“部分数据查询”,即就是展示一部分数据。

作者丨龙虾编程

来源丨公众号:龙虾编程(ID:gh_af8b9832912f)

dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn

相关内容

热门资讯

伊朗、美国和卡塔尔开会讨论黎巴... 6月21日消息,据伊朗媒体21日报道,伊朗、美国和卡塔尔三方会议正在瑞士比尔根山举行,议题涉及黎巴嫩...
瑞典时隔40多年再建反应堆,北... 6月21日消息,瑞典最大电力企业瓦滕法尔集团近日宣布,已选定英国罗尔斯-罗伊斯公司在瑞典西南部建造3...
伊媒称霍尔木兹海峡船舶通行量降... 6月21日消息,据伊朗塔斯尼姆通讯社今天(6月21日)报道,海事导航数据显示,自20日伊朗军方宣布关...
伊朗最高领袖顾问:若备忘录停留... 6月21日消息,伊朗最高领袖顾问穆赫贝尔在社交媒体发文说,伊美谅解备忘录中的各项承诺必须得到全面落实...
云南省怒江州贡山县独龙江公路中... 6月21日消息,6月20日9时31分,受持续强降雨冲刷侵蚀,云南省怒江州贡山县独龙江公路(独龙江乡至...
美伊代表团抵达瑞士谈判会场 6月21日消息,据瑞士外交部21日消息,美国和伊朗代表团均已抵达位于瑞士比尔根山的美伊谈判会场。(新...
亿道信息:控股股东一致行动人减... 6月21日消息,亿道信息公告,公司控股股东、实际控制人及其一致行动人合计持股比例由57.30%变动至...
北方华创:高级副总裁唐飞辞职 6月21日消息,北方华创公告,董事会于近日收到唐飞提交的辞职报告,因工作调整,唐飞申请辞去公司执行委...
瑞士首轮正式会议将于北京时间1... 6月21日消息,据报道,美国、伊朗和巴基斯坦已开始进行双边及三方接触。伊朗方面称,首轮正式谈判会议将...
民俗游是端午“C位”,“赛旅融... 6月21日消息,今年端午期间,周边游、民俗游火热。去哪儿旅行数据显示,截至6月21日,“端午”“龙舟...