前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >分库后如何处理分页?

分库后如何处理分页?

作者头像
dys
发布2018-04-03 14:27:40
1K0
发布2018-04-03 14:27:40
举报
文章被收录于专栏:性能与架构性能与架构

在数据量过大以后,通常都会进行分库操作,把一张表拆分到不同数据库中

例如 tb1 表被拆分到3个库中,分库1、分库2、分库3

现在想执行分页操作

SELECT c1 FROM tb1 ORDER BY c1 LIMIT 4, 2

如何处理呢?查了一些数据库中间件的资料,有一个通用的思路:

到每个分库中取出从0开始、到目标结果集的最后一条记录,汇总到一起,进行排序,然后再取出目标位置的记录集合

例如上面的sql是根据 c1 排序,要取得第5、6两条记录

那么就会对每个分库的 tb1 表执行下面的语句

假设结果分别为

开始按顺序查找

第0条(结果为1)没到第4条,略过

第1条(结果为2)没到第4条,略过

第2条(结果为3)没到第4条,略过

第3条(结果为3)没到第4条,略过

第4条(结果为4)已到第4条,放入结果集

第5条(结果为5)已到第4条,放入结果集

这时结果集合为:4、5,已经达到目标条数2,结束查找

这个思路很简介,实现起来也不复杂,缺点就是当起始位置很大时,所有分库的查询数据将非常大

例如

select c1 from tb1 order by c1 limit 100000000, 2

所有分库都要查询 100000002 条数据,然后再进行汇总排序操作,这个性能很难接受

这个情况也没有特别好的解决办法,但如果各个分库数据分布大致一样,那么可以减少分库大部分结果集

例如sql

select c1 from tb1 order by c1 limit 9999999, 4

现在有3个分库,因为数据分布大致一样,那么可以等分查询

9999999 / 3 = 3333333

各分库执行

假设结果为

找出查询结果中最小和最大值,4、18

以最小值和最大值为界再查询各库,结果为:

查出返回结果中第一条的offset,例如

那么第 3333331 条相当于第 9999996(3333331 + 3333332 + 3333333)条记录,从它开始按顺序查找

略过前3条,取得后面的4条记录,查询完成

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-01-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JAVA高性能架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档