SQL的性能测试
BASE:10w条数据
Mysql8.8数据库
ORM框架:MybatisPlus
数据库连接池:Alibaba-Druid
实体类工具:Lombok
开发语言:JAVA
框架:SpringBoot
16G内存,4核8G的处理器
数据库表设计
单个插入
private void singleSave(List<Student> list) {
long start = System.currentTimeMillis();
list.forEach(e -> {
studentService.save(e);
});
long end = System.currentTimeMillis();
System.out.println("singleSave消耗时间" + (end - start) + "毫秒");
}
输出结果:
singleSave消耗时间83831毫秒
结论;
能很明显的看出 十万条数据 每一条都一个个插入 这是非常傻逼的操作 花了我们整整84秒的时间 非常弱智的操作
一次批量插入
private void singleBatch(List<Student> list) {
long start = System.currentTimeMillis();
studentService.saveBatch(list);
long end = System.currentTimeMillis();
System.out.println("singleBatch消耗时间" + (end - start) + "毫秒");
}
输出结果:
singleBatch消耗时间13965毫秒
结论;
从这里我们就可以发现了一点端倪了 这说明dao层操作 真正耗时的可能不是插入操作 而是我们与数据库的网络连接次数
能看到我们只连接一次的情况下 批量插入的时间快了5倍左右 这种性能提升让我豁然开朗,14s左右的时间
多线程单次插入
线程池中20个线程,每个线程每次处理1000个,我们模拟做100次循环
private void multithreaded_single_insert(List<Student> list) {
ExecutorService executorService = Executors.newFixedThreadPool(20);
CountDownLatch countDownLatch = new CountDownLatch(100);//做结束收尾
long begin