前言:
当我们的应用在经历时间的洗礼之后,mysql数据库势必会遇到数据量过大,需要分表分库,当然,我们应该一开始就进行这个操作!!
切入正题:
按时间水表无限分表
例如:订单表我们对他进行水平分表,一时间对位订单号的头部 如:20210101112233321654,其中20210101112233部分为当前时间精确到秒,321654是我们的随机数,构造出的订单号作为分表标志,然后我们假设,一个月一张表,那么上述的订单号应该在 order_202101这张表中,当我们需要取出这条记录的时候,我们只要在代码中分析这个订单号的时间部分,就可以定位到表所在。当然这样的表,在库中有很多 10张20张更多!!
问题浮现
现在有个问题,如果我们的管理后台要按条件查询订单,而且!!!领导说了,你还必须有分页!!!!!!!!!怎么办?
哎!!这么无礼的要求满足他吧!
单表分页的时候,我们使用limit设置步长和起始位置 limit(offset,start)
可是现在有20张表,怎么办?
1,首先我们应该按照条件查询出20张表所有的记录条数,一张一张的查询(如果有时间作为条件就好了!-,-),然后全部相加就是总记录数。
2,有了总记录数,就有了总页数,然后,根据传过来的page,又因为我们知道每张表的记录数,所以我们可以精确的确定对应的offset数量的记录都在那几张表中,如:page=5,offset=10, 如果第一张表的记录数是32,第二章的记录数是40,那么我们只需要查询第二张表就可以实现,10*(5-1)=40,start= 40-32=8 所以,第五页的记录数应该是 select from table2 limit(offset,8),这样,我们就可以查询出所有page=5的数据了。
3,20张表!!!!!每次都查询每张表的记录数,数据库要死的!!!!!!那怎么办类?首先,我们知道最新的表是动态的,但是之前的月份或者日期是静态的不会在增加新的,所以可以将最新以外的表的对应条件记录数进行redis(nosql)进行缓存,这样 我们只有在第一次进行查询的时候查询所有表的记录数,其他的时间下,我们只需要在需要显示的表中进行查询就可以了。
ps:如果10条记录在两张不同的表中,使用递归进行查询就可以了,知道满足我们的条件为止!!!!!!当然了,即使经过了2年,有了分库,也可以用相同的原理进行查询。
好了,下次聊聊分表的下拉加载!!!