大表添加字段不停服思路

前言

        这个是源自于昨天写的业务背景,对接苹果支付退款退单接口-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操作,我找到好方法了 - 知乎

你可能感兴趣的:(数据库与缓存,数据库)