tidb批量插入数据速度慢有没有什么优化方向

现在需求是让开发吧云上的tidb历史数据查出来,插入到本地的tidb里面。代码里面是吧每天的数据查出来之后拼接成一条条insert,每次insert一条数据。5000条insert用了3分钟。
有没有什么可以提高速度的。十几个表呢。每个表每天百万数据。如果按照这速度,一天估计很难同步完。。

https://docs.pingcap.com/zh/tidb/stable/java-app-best-practices#使用-batch-批量插入更新

2 个赞

注意热点问题,增加并发,增加batch

1 个赞

每次insert一条数据肯定慢啊,拼接成insert into XXX values ()()()
一个sql一次插入1万条

这应该用数据迁移的方式更合理一点

测试过,我也知道一次1w插入速度很快,但是开发那边是一次性获取数据到他们服务器。然后拼接成一条条insert。我把网址发给开发,让他根据官方文档改改看吧。

用dumpling+lightning的方式是不是会好一点

1 个赞

这是要人为手动操作。现在是要求每天或者每周定时去同步云上的历史数据到本地呢。

线下能连云上的话,是不是可以写个脚本弄个cronjob。

服务器上写shell脚本搞job??这样的话也只能一次插入一天。一天200w,可能太大了吧。貌似一次性10G就会报错。

可以考虑CDC

不太好搞。云上是4.0.2版本和一个4.0.9版本。本地我搞的是5.0版本。不要求实时性,要求同步的是500天前的数据到本地。

不要求实时性那就Dumpling+lightning吧。
用代码实现,同时要求一定实时性的话,可以考虑在中间加套Kafka。之前做过Oracle到ES的同步程序,Kafka性能很好。你这个是历史数据,只需要做最终行数比对不需要行对比和重传机制,开发工作量应该不大。

:yum:这样的话,我推荐ETL工具kettle,支持多线程插入,支持定时执行,支持异构数据库,支持跨平台部署,内网环境能达到每秒几万的速度,如果带宽足够,速度应该差不多。

1 个赞

我不是开发,dump和lighting这个要手动去操作导出导入吧。如果让开发用代码去实现,他们估计还要再去学一下这个工具和你说的这个kafka。开发现在已经部署一套了正在测试。只是insert一条条速度慢。月底就要上线。让他们吧之前开发的推到重新搞个新的。估计不太可能

跨网络。20M带宽。实际速度估计是3M/s左右

:thinking:我觉得问题不大。不过先排除一下tidb集群的写入性能问题,手工执行5000条insert也需要3分钟么?

1 个赞

你走公网了吧,还还的考虑网络因素,看看你公网带宽,然后觉得对上行数据commit一次。

对,手动5000条复制到navicate里面执行也是200s

这是手动执行结果。最后实际搞的话。确实还要走公网,网速可能是3m/s