在工作中肯定会遇到批量修改数据的场景,但是究竟怎么选择才能更快速的完成修改呢?
目前仅对一下几种方式进行对比
方式1:外层for循环每一次处理就调用一次mysql数据库
方式2:使用MyBatis的xml循环每条语句使用;分割
有需要的可以在尾部获取 制造数据的语句
在100w条数据中 根据主键 update 后面的字段
分别更新100条 500条 1000条 1w条对比更改需要的时间
分别把第二个字段更改为主键+1
| \ | 5 | 10 | 100 | 500 | 1000 | 1w | 10w | 20w |
|---|---|---|---|---|---|---|---|---|
| for循环 | 197ms | 203ms | 326ms | 746ms | 1323ms | 7048ms | 55380ms | 127280ms |
| ForEach | 177ms | 183ms | 289ms | 515ms | 791ms | 5828ms | 55621ms | 103119ms |
| 分别相差 | 20ms | 20ms | 28ms | 231ms | 532ms | 1220ms | -241ms | 24161ms |
基本上ForEach都快于for循环
总结无脑用ForEach就行
194ms|206ms| 221ms|373ms|815ms|1144ms|6573ms|50505ms
| \ | 2 | 5 | 10 | 100 | 500 | 1000 | 1w | 10w |
|---|---|---|---|---|---|---|---|---|
| for循环 | 194ms | 206ms | 221ms | 373ms | 815ms | 1144ms | 6573ms | 50505ms |
| ForEach | 170ms | 191ms | 223ms | 225ms | 195ms | 215ms | 498ms | 2250ms |
| 分别相差 | 24ms | 15ms | -2ms | 148ms | 620ms | 929ms | 6075ms | 48255ms |
总结无脑使用foreach就好了,insert的优化巨大。update也有明显的减少
具体代码
https://github.com/lucine-maker/batch-update
创表语句
CREATE TABLE `batch_test` (
`emp_no` int NOT NULL,
`title` varchar(50) NOT NULL,
PRIMARY KEY (`emp_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- 写函数之前必须要写,标志
DELIMITER $$
CREATE FUNCTION `mock_data` ()
RETURNS INT
BEGIN
DECLARE num INT DEFAULT 1000000;
DECLARE i INT DEFAULT 0;
WHILE i