采用事务后,如果几千条数据,插入更新下应该几秒钟搞定了。前提是建立了合理的索引。当然如果你 data 非常大可能久一点。
你这个需求还是不明确,INSERT ... ON DUPLICATE KEY UPDATE Statement 的意思如果唯一索引不存在就插入否则更新。并不能指定其他条件。这篇文章讲得很清楚了
https://blog.csdn.net/analogous_love/article/details/71085001。官方语法也没有提供扩展 https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html。所以除非你是根据 ID 来的,或者定了一个唯一索引。且实际不是你说的 “比较新的插入,否则失败”。
我理解你的需求应该是“如果数据有更新,那么执行更新,否则忽略这个数据更新。”
如果是我理解的,那么方案是:
update order set data=new_data where id=xxx and modified_time < new_time; (只需要 id 主键即可,性能最好)
比如你的目的表数据不全部来自来源表,那么可能需要加一个唯一索引字段 from_id
update order set data=new_data where from_id=xxx and modified_time < new_time;(需要对 from_id 建立唯一索引)
你首先要做的是,确定性能问题出在查找数据时的读取磁盘速度慢还是写入磁盘慢。