背景
数据迁移同步领域,做热点合并可以大大提升效率。本文对实现写入SQL热点合并中的细节做一些记录和备忘。
何为热点合并
相同pk上的DML在同步的时候,其实可以合并成一条变更,对于同步来说,我们保证最终一致性即可。下面的例子可以方便理解。多个update事件,我们只要保留最终结果即可,delete事件以前的变更,其实可以都忽略。
1 2 3 4 5 6 7 8 9 10 11 12 13
| ## case 1 ## 合并后等价为insert into t1(id,name1,name2) values(1,'wanshao11','wanshao22'); insert into t1(id,name1,name2) values(1,'wanshao1','wanshao2'); update t1 set name1='wanshao11' where id=1; update t1 set name2='wanshao22' where id=1;
## case 2 ## 合并后等价为delete from t1 where id=1; insert into t1(id,name1,name2) values(1,'wanshao1','wanshao2'); update t1 set name1='wanshao11' where id=1; update t1 set name2='wanshao22' where id=1; delete from t1 where id=1;
|
合并规则
针对一个有序的变更序列,实现热点合并,可以遵循以下规则:
- 针对INSERT/UPDATE,从第一条事件开始,依次合并所有update的列的值,序列靠后的事件中的列值覆盖前面的
- 针对一批事件中包含DELETE的,把pk不冲突的DELETE提取出来单独执行。pk不冲突,意味着这个delete关联的pk在这批数据中不存在任何这个pk上的变更。
- 针对存在pk冲突的DELETE事件,在这个delete事件变更前的相同pk上的操作可以全部忽略