场景:假如T日需要将a表中T-1日的数据同步到b表。由于某种业务需求a表中已经同步到b表中的数据发生了变化需要重新同步,这个时候就会用到插入更新插件,也就是
说a表中数据重新同步b表,若b表中存在此数据(根据唯一id)则执行更新操作,否则执行插入操作。
1、软硬件环境
本次教程基于本机docker版mysql 8.x数据库进行测试,如下图所示:
电脑是基于本人mac笔记本,配置如下:
2、生成数据
使用表输出组件往t1(id,name,createtime)表中插入100条数据,采用单线程5000笔批量提交方式,速度在2.6w/s左右,如下图所示:
表输出步骤配置如下:
初始化数据如下:
3、使用插入/更新步骤,存在数据则更新,不存在则插入新数据。如下图所示
性能非常差,原因是每次都需要将旧数据查出来,然后和新数据对比是否有变化,有则执行更新操作,无则插入数据。每条数据都要和数据库交互两次。
数据更新如下:
4、使用自研Upsert组件,执行插入更新操作,如下图所示:
自研Upsert插件单线程速度在1.4W/s,之所以速度比原有插入/更新大幅提升,是因为Upsert处理每条数据时只需要和数据库交互一次。
这里验证的是假如每条数据都发生了变化,若有少量变化或者没变化速度将大幅提升。
Upsert配置如下:
更新数据如下:
数据没有变化是Upsert执行如下图所示:
注:本次测试结果是基于本地环境,开单线程的测试结果,若放到服务器上多线程模式速度会更快。
Done!!!