本文共 4536 字,大约阅读时间需要 15 分钟。
org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-starter-web org.project.lombok lombok 1.18.12 org.mybatis.spring.boot mybatis-spring-boot-starter 2.1.2 mysql mysql-connector-java runtime org.springframework.boot spring-boot-starter-test test org.junit.vintage junit-vintage-engine
CREATE TABLE `people` ( `id` bigint(8) NOT NULL AUTO_INCREMENT, `first_name` varchar(50) NOT NULL DEFAULT '', `last_name` varchar(50) NOT NULL DEFAULT '', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
@Testvoid init10wData() { for (int i = 0; i < 100000; i++) { People people = new People(); people.setFirstName(UUID.randomUUID().toString()); people.setLastName(UUID.randomUUID().toString()); peopleDAO.insert(people); }}
update people where id = #{item.id,jdbcType=BIGINT} first_name = #{item.firstName,jdbcType=VARCHAR} last_name = #{item.lastName,jdbcType=VARCHAR}
update people where id in when id=#{i.id} then #{i.firstName} when id=#{i.id} then #{i.lastName} #{item.id,jdbcType=BIGINT}
replace into people (id, first_name, last_name) values (#{item.id}, #{item.firstName}, #{item.lastName})
insert into people (id, first_name, last_name) values (#{item.id}, #{item.firstName}, #{item.lastName}) ON DUPLICATE KEY UPDATE id=values(id), first_name=values(first_name), last_name=values(last_name)
@Testvoid updateBatch() { Listlist = new ArrayList<>(); int loop = 100; int count = 100000; Long maxCost = 0L; Long minCost = Long.valueOf(Integer.MAX_VALUE); System.out.println("开始"); Long startTime = System.currentTimeMillis(); for (int j = 0; j < count; j++) { People people = new People(); people.setId(ThreadLocalRandom.current().nextLong(0, 100000)); people.setFirstName(UUID.randomUUID().toString()); people.setLastName(UUID.randomUUID().toString()); list.add(people); } for (int i = 0; i < loop; i++) { Long curStartTime = System.currentTimeMillis(); peopleDAO.updateBatch4(list); Long curCostTime = System.currentTimeMillis() - curStartTime; if (maxCost < curCostTime) { maxCost = curCostTime; } if (minCost > curCostTime) { minCost = curCostTime; } System.out.println("耗时-" + (System.currentTimeMillis() - curStartTime)); } System.out.println("结束"); System.out.println("平均-" + (System.currentTimeMillis() - startTime) / loop + "ms"); System.out.println("最小-" + minCost + "ms"); System.out.println("最大-" + maxCost + "ms");}
数据量 | for循环 | case when | replace into | ON DUPLICATE KEY UPDATE |
---|---|---|---|---|
500 | 100次 | 100次 | 100次 | 100次 |
1000 | 100次 | 100次 | 100次 | 100次 |
5000 | 100次 | 100次 | 100次 | 100次 |
10000 | 10次 | 10次 | 100次 | 100次 |
50000 | 10次 | 卡死不动 | 100次 | 100次 |
100000 | 10次 | 卡死不动 | 100次 | 100次 |
参考文章: