关于分库分表中分组,排序,分页实现

3 篇文章 0 订阅
3 篇文章 1 订阅

分库分表的原理估计就不说了,一般是会有一个种子字段作为分库分表路由字段,比如如果是对书籍表进行分表,可以用bookId作为种子字段,然后如果要分128张表,用bookId%128 作为分表路由规则。

比如如果bookId为1的数据分在book_1表,bookId为2的分到book_2,bookId为129的分到book_1表。

 

然后分组,排序,分页的实现,如果加了where bookId 作为条件,跟单表查询差不多,无非多一个路由选表而已。

 

下面主要分析无种子字段作为条件的分组,排序,以及分页实现。

 

1.分组

分组实现较简单,只需对128张表各自进行group by ,将128张表的结果,全都取到内存中,进行合并,如果有having条件再根据合并的结果进行筛选。

 

2.排序

排序都是要根据某个字段进行排序,首先要对128张表排序后的数据取出到内存,然后可以通过归并排序的方式对128张表的数据进行重排,最终展示到前端。当然,排序难以支持大批量数据的返回。所以建议一般只limit 1000条,这样才可实现内存中排序。如果数据量非常大,大到内存都装不下,可以通过将数据缓存到文件的方式实现,这点跟hadoop的实现原理是一致的。当然还有大到文件都装不下的情况,则要编写更复杂的排序算法,那个我们就不讨论了。

 

3.分页

分页我认为为了自然分页,最好能在数据库表增加一个数据创建时间作为辅助字段,然后分页的数据根据创建时间进行排序,然后取出符合条件的最前面n条即可。如果没有创建时间可以根据表下标数据进行返回,比如优先返回下标最小的数据。当然核心问题基本跟排序类似,如果数据量很大会非常慢,甚至内存装不下。

 

4.其他如sum,avg,max等方法

基本是对128张表的数据先各自进行计算,然后再归并结果返回即可

 

 

当然以上只是简单实现,我相信真正去做一个分库分表的插件,如shadingJdbc这种,还有许多可以优化的地方,此处仅作为学习参考。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值