表中已有数据500w
插入数据使用切片加异步方式 List<List> split = CollUtil.split(tableList, 5000);
List<CompletableFuture> collect = split.stream().map(dataList →
CompletableFuture.supplyAsync(() → {
tableDao.insertBatch(dataList);
//insert使用多value批量insert方式.
return 1;
}, executorService)).collect(Collectors.toList());
//executorService设置的是20
在不同切片size下插入50w数据消耗的时间
size100 55 s 9090条/s
1000 132 s 3787条/s
5000 69 s 7246条/s
50 62 s 8064条/s
感觉插入效率不满意,如何能提高插入速度?
附带热力图
看看计划,是慢在哪一个步骤
INSERT 有啥好看的
再加几个进程并发写呢?
插入数据的时候看一下Dashboard 的热力图,是否有热点存在。
同时注意观察tikv 的监控,看看有无性能瓶颈点
同意上面,看看有没有热点region,然后系统级别的监控,内存 io是不是瓶颈
可以参考文章的排查过程:
看看执行计划
热力图是真的热。
tikv对应的盘是sdd还是hdd
并发高机械硬盘性能会差一点
机械盘
貌似不适合用hdd
看上去所有机器都挺热呀
TiKV推荐用SSD盘,避免磁盘IO成为瓶颈
1个表结构可以发一下,看能不能优化
2个就算你表结构优化了,机械盘最高也就那样,不会提升到太高的程度的。。。
有时也有看的必要,并发高的时候可以看锁信息
热力图太亮了,应该是热点问题,数据的主键是不是递增的?同时查看下集群的qps是否均衡,应该是集中到某一台机器了
jdbc连接是不是可以配batch?