今天给大家分享一下,工作中用过的一些分表策略!
首先!!垂直分表不是解决数据过大的根本方法!水平分表才是!!
下面聊几个案列
一。订单表
,
一般来说订单表单表在数据量到达200w的时候,开始慢慢显现出性能瓶颈,当访问数量增加时,可以使用从库加缓存的方式解决,但当数据量太多如2亿条的时候,我们就应该对表进行水平切割了,先说按月分表,就是每个月建立一个表 如 order_202006,订单号一时间为前缀,根据订单号先定位到所在的库,在进行存储,get的时候也是通过订单好直接定位到订单所在的库,然后获取。这样,即实现了表的无限扩展,又实现了数据的存取。
问题1,如果需要分页怎么办?
https://blog.csdn.net/aylui2012/article/details/118400451?spm=1001.2014.3001.5501
看这里(我的bolg)
问题2,需要客户上拉加载怎么办?
上拉加载的订单数据中,刷选条件一般都有 时间、状态、名称、等,所以这些条件基本都是可以顺序查找的,所以我们可以用递归函数去解决,比如按名称,第一次加载的话,先缓存好所有表中对应的记录条数,然后更具条数每次取10条,第二次加载的时候,直接使用缓存数据,后端接受上一次的最后一个订单号,用来确定起始表(库)的位置,然后加载相同的数量,若果表历遍完毕,记录数不够10条后,则代表没有更多的记录了。(一个表中的记录数为0的话,递归会直接跳过,所以不会查询,记录数不够10,去查下一章表,效率那叫一个快呀!!!)。
附:多数情况下写数据的时候,你还要开启事务去处理和订单表相关的数据,这就需要你具体分析,把相关的数据进行处理,比如库存表,这就需要分布式事务去处理问题了(这个之后的文章中分析)
二,商品表
商品表的分库条件,可以使用分类、商家id、店铺id等,如果商品数量是可以估算的,那么我们只需要分成诺干个表,然后模运算分表条件,存到响应的表中即可。如两个表,分别定义为good_0,good_1。i=2. %i=0存入good_0, %i=1存入good_1。
如果商品数量不可预测呢?
如果扩容的话,我们只扩容库不要扩容表的数量,
方案1:停机扩容。新增加一个库,建立表good_2,good_3.将good_0的数据复制进good_2,good_1复制到good_3中,然后删除其中的冗余数据,现在i=4,更具模运算,找对应表即可!
缺点:停机啊!!!!!!!
方案2:平滑扩容。其实还是方案1的办法,只是我们在最一开始的的时候,要记录下来主库二进制日志binlog(一版高可用的场景下,最开始都会配置两台数据库,互为主备,一台宕机之后,通过虚ip飘逸进行切换),新增加的库和原来的库配置主备,两台库的数据通过同步一模一样,库中的表都是good_0和good_1,然后业务层更改库的数量,业务的读写变为先取模找库,再取模找表,业务层扩展步骤完毕,现在,我们取消互为主备的配置,数据不再同步,最后一步,通过模运算,删除冗余数据,平滑扩容完毕!扩展库的时候请2倍数的扩展,这样只需要删除冗余数据就可以了