关于分库分表中分组,排序,分页实现
分库分表的原理估计就不说了,一般是会有一个种子字段作为分库分表路由字段,比如如果是对书籍表进行分表,可以用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这种,还有许多可以优化的地方,此处仅作为学习参考。