生产单表数据5千万,要更新其中5万条数据的其中几个字段。
以下使用开发环境,单表150万,更新5万条左右数据。使用了以下三种方案。
1,使用以下语句,批量执行
update table set field1=1,field2=2 where field3=3 and field4=4
执行几秒钟就挂了
2,先通过条件将要更新数据查出,使用replace into ,原理先删后插,没有指定值的字段,将会默认为空
replace into t_result_item(item_id,score,recognition_value)
VALUES
<foreach collection="list" item="item" separator="," close=";">
(#{item.itemId},#{item.score},#{item.recognitionValue})
</foreach>
14秒左右 维护索引
3,先通过条件将要更新数据查出,使用insert into on duplicate key update ,原理尝试插入,若存在则更新,没有指定值的字段,将会默认为原数据的值
insert into t_result_item(item_id,score,recognition_value)
VALUES
<foreach collection="list" item="item" separator="," close="">
(#{item.itemId},#{item.score},#{item.recognitionValue})
</foreach>
on duplicate key update
score = VALUES(score),
recognition_value = VALUES(recognition_value)
8秒左右
使用update语句执行次数太多,太耗性能;replace方案原理是先删后插,此过程会维护索引;insert 方案原理是尝试插入,若存在则更新,不存在再次维护索引,最终使用第三种方案