程序写入tidb速度慢的问题

表中已有数据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
感觉插入效率不满意,如何能提高插入速度?
附带热力图

https://docs.pingcap.com/zh/tidb/stable/dev-guide-insert-data
看看这个。

1 个赞

看看计划,是慢在哪一个步骤

INSERT 有啥好看的 :joy_cat:

再加几个进程并发写呢?

插入数据的时候看一下Dashboard 的热力图,是否有热点存在。

同时注意观察tikv 的监控,看看有无性能瓶颈点

同意上面,看看有没有热点region,然后系统级别的监控,内存 io是不是瓶颈

可以参考文章的排查过程:


热力图不太会看大佬

看看执行计划

热力图是真的热。
tikv对应的盘是sdd还是hdd

并发高机械硬盘性能会差一点

机械盘

貌似不适合用hdd

看上去所有机器都挺热呀

TiKV推荐用SSD盘,避免磁盘IO成为瓶颈

1个表结构可以发一下,看能不能优化
2个就算你表结构优化了,机械盘最高也就那样,不会提升到太高的程度的。。。

有时也有看的必要,并发高的时候可以看锁信息

热力图太亮了,应该是热点问题,数据的主键是不是递增的?同时查看下集群的qps是否均衡,应该是集中到某一台机器了

jdbc连接是不是可以配batch?