【数据库】大数据量下优化on duplicate key update造成的性能问题

insert into xxx on duplicate key update xxx=xxx语句可以优秀地解决插入数据时产生的重复主键问题,前提是设置了正确的unique key。
但在大数据量情况下(超过1w条),在duplicate key较少的情况下仍表现良好,遇到duplicate key较多的场景下,执行效率出现断崖式降低。
为了解决此问题,
优化点1:可采用先update再进行insert ignore的方式替代原逻辑。
实际场景如下:A表中数据(每日更新)需要插入B表,且B表中数据状态会根据A表的数据进行更新。
优化点2:对数据按照分页思想进行分批插入。
运用原逻辑

insert into B (id, name, age, sex)
 select A.id, A.name, A.age, A.sex from A left join B 
 on A.id = B.id and A.name=B.name 
 on duplicate key update age=values(age), sex=values(sex)

优化点1
运用替换后的逻辑分两步走
step 1,更新B表中存在于A表中记录的age和sex

update B join A on A.id = B.id and A.name=B.name 
set age=A.age, sex=A.sex

step 2, 将A表中B表不存在的记录,插入B表

insert ignore into B (id, name, age) from A

优化点2
例,15w条数据,每次插入1w条
step1

update B join 
(select id,name,age,sex from A limit pageNumber,pageSize) aa
 on aa.id = B.id and aa.name=B.name 
set age=aa.age, sex=aa.sex

step 2, 将A表中B表不存在的记录,插入B表

insert ignore into B (id, name, age, sex) from (
select id,name,age,sex from A limit pageNumber,pageSize
) aa

注意:update 和insert执行时间较长时,连续执行会造成mysql死锁,做完update 操作后,根据实际数据量,应进行sleep,避免产生死锁

Thread.sleep(1000)

15w万条数据,实测有效。

ON DUPLICATE KEY UPDATE 在执行插入操作时,如果遇到重复的唯一键值,会执行更新操作。这样可以避免插入重复数据,提高数据的完整性。然而,当存在两个唯一主键时,使用 ON DUPLICATE KEY UPDATE 可能会导致性能问题和潜在的隐患。 性能问题: 当存在两个唯一主键时,使用 ON DUPLICATE KEY UPDATE 可能会导致性能下降。因为在执行插入操作时,数据库需要检查两个唯一主键是否已存在,这会增加查询的开销。如果数据较大,这种开销可能会显著影响性能。 潜在的隐患: 当存在两个唯一主键时,使用 ON DUPLICATE KEY UPDATE 可能会导致数据不一致的隐患。因为在执行更新操作时,如果更新的字段与另一个唯一主键相关,可能会导致数据不一致的情况发生。例如,如果更新的字段与第一个唯一主键相关,而第二个唯一主键的值发生了变化,那么更新操作可能会失败或者更新了错误的记录。 为了避免性能问题和潜在的隐患,可以考虑以下几种解决方案: 1. 使用单一唯一主键:如果可能的话,将两个唯一主键合并为一个单一唯一主键,这样可以避免使用 ON DUPLICATE KEY UPDATE。 2. 使用事务:在执行插入和更新操作时,使用事务来确保数据的一致性。通过将插入和更新操作放在同一个事务中,可以避免数据不一致的情况发生。 3. 使用其他方式处理重复数据:如果不使用 ON DUPLICATE KEY UPDATE,可以通过其他方式处理重复数据,例如使用 REPLACE INTO 或者先查询再决定是插入还是更新。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值