INSERT ... ON DUPLICATE KEY UPDATE这种方式性能如何?

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】7.5
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
简单的说就是业务上按主键处理数据,没有插入有则更新,tidb支持了 INSERT ... ON DUPLICATE KEY UPDATE方式,那么是否比1次查询+1次更新或者插入方式性能有明显提升呢

会比拆开的查询+更新好

单纯插入的性能肯定更好了

主要还是得看你的场景,比如处理数据量大不大,并发高不高,如果是处理数据量很少,并发很小,还是可以的;但是这种数据量一大或者并发一高,冲突几率可能会比较大,处理效率也一般;我们采用的都是先查询再流式并发写入,这种效率还不错,特别是对大数据加工的时候,采用TiFlash查询+流式并发写入,相比INSERT … ON DUPLICATE KEY UPDATE,效果会明显更佳;目前官方推荐的也是先查询再流式并发写入。
可以看下官方的批处理一些测评:

我们是并发高但是肯定不会有数据冲突,同一行数据同一个时间只有一个操作

性能还可以。可以自己模拟数据压测

比插入慢一些

那直接用insert应该会好一点吧。

数据量大不大呢?如果是处理的数据量大,建议还是用读写分离,先select后流式并发写入。

有数据更新没数据插入,直接insert也得先判断一次数据有没有,大部分还是更新

每一条数据是一个事务,不能批量做

:thinking:哦,是我理解错了。我以为是业务层已经控制了,在业务层就知道是插入还是更新,不会出现并发插入的情况。

这种操作在单个事务中完成,因此相对于先查询后更新或先插入再更新,减少了网络往返次数和操作的复杂性。同时,由于是单条语句完成所有操作,可能使得索引和统计信息的更新更加一致。

关注一波,记录