大表添加字段不停服思路

前言

        这个是源自于昨天写的业务背景,对接苹果支付退款退单接口-CSDN博客

    

        涉及到了order表的改动,而目前order表已经有2千万的数据,如果退款字段都直接加在这张表里面可能会比较慢,所以才有这篇文章,文章里只讨论思路,而不进行具体的编码实现,真正操作需要自己去注意细节

大表添加思路字段

直接加

        也就是直接利用 alter table add 命令加,这种是最原始的,可能比较慢,这里就不讨论了

阿里云操作

        参考地址:如何进行无锁结构变更_数据管理 DMS-阿里云帮助中心

程序处理

基础版本
  1. 对 order 数据表结构进行复制,放到一张新表里面 order_back(只包含结构)
  2. 在order_back里面添加需要的字段(没数据加字段很快)
  3. 把order的数据转移到order_back里面去
  4. 把order_back和order表名进行互换即可

这种版本就是中间转移数据会比较慢,其他的还行

进阶版本
  1. 对 order 数据表结构进行复制,放到一张新表里面 order_back(只包含结构)
  2. 在order_back里面添加需要的字段(依然很慢,但是不影响业务)
  3. 把这段时间内order产生的数据插入到order_back上
  4. 替换表名

这种版本可以节省后面转移数据的等待时间,在第1步就处理了,但是这里仍然有问题,假设中级order表有更新那么order_back是不知道的,其实基础版本也有这个问题,虽然订单表一般支付后就不会改了,但是还是有可能会发生,解决方案如下

进阶版本-改版1

       就是数据转移完以后不是直接把原有的order删掉,而是等转移以后,再起一个定时器去扫描,等到数据处理完成以后再把定时器去掉即可

        这种方式确实可以做到最终同步,但是还是比较麻烦,需要借助定时器处理后续逻辑

进阶版本-改版2

        我们其实可以考虑一个问题,其实核心就是怕有数据的修改而引起数据不同步,一般做法可能就是在代码里面添加逻辑去记录修改的记录然后转移完成以后进行更新,这种方式确实可以,但是还可以用一种更妙的方式处理

        就是我们再起一张结构跟order一样的order_update表,然后在order表添加一个触发器,当有修改的时候把新的数据插到order_update上,这样一来就很好处理了,当前面的数据迁移完毕以后,我们只需要再扫一下order_update的数据,然后进行对应的修改就行了

        这种做法就不用在程序里去记录修改了,也不需要用定时器处理了,当然了这里也可以监控binlog(原理跟这个差不多)

结语

        到这里就结束了,以上是我的几种方式,如果有问题或者大家有更好的方案,可以提起来一起讨论一下

mysql 8.0 版本,INSTANT 算法,可以参考文章

       在?上次你问对大型表的DDL操作,我找到好方法了 - 知乎

补充

        今天在操作的时候先复制了一张order_back表,也是2千万数据,然后在上面加居然只要8秒钟,超出我的想象

        然后我在真实的表加的时候居然只要0.2s,更是打破了我原有的思维,没想多居然这么快,我觉得可能跟两方面的原因有关

1. 数据库使用的阿里云的rds服务器,看来这玩意收费真的有他的道理的

2. mysql版本为8.0,应该是默认使用了INSTANT 算法,估计确实快了很多

        

        虽然最终问题得到了解决,但是在收集解决大表添加字段的问题上一样是得到了很多的启示,而且方案在一定程度上也是可用的

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值