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

可以使用官方推荐的迁移工具或者ETL工具,将数据按条件分成多个任务,然后并行执行导入,速度会快一些。如果想使用代码,不要一条一条导入,可以一批次导入1000条,并使用多线程方式,并行执行,一个线程一张表,一个表按条件把数据分割成多个批次,批次执行效率比你现有的方法高很多

:flushed:那和用什么工具就没关系了,感觉就是单纯的写入性能慢。建议排查一下写性能,如果有多余资源可以验证一下kettle,新手按教程最多半天就验证完了。

1 个赞

这是云上的阿里云的ssd磁盘 isnert 1条就是这么个时间 100ms左右,还不是本地服务器二手机械硬盘呢。一次性insert 10000条数据1s ,一条条的 insert 10条差不多也要1s。感觉性能就是这样

对了,监控一下磁盘IO和带宽,如果IO和带宽没有满,我觉得可以用多线程插入,直到打满。

1 个赞

看了监控了。都是平平淡淡的一条横线。没有起伏特别高的。我和开发说了。让他并发处理

感觉用dumping比用这个方式强。
增量导入lightning是物理导入快还是逻辑导入快,可能还要测测。
导出代码写成这样,真不一定比dumping强。

https://docs.pingcap.com/zh/tidb/stable/dumpling-overview#使用-dumpling-导出数据

bulkinsert方式

我知道这个,但是这个要手动去导出传输然后导入。没办法全自动化呀。每天或者每周执行一次。同步,如果每天自行那就是同步500天前那一天,如果每周,那就是500-507 七天数据。总不能每次要修改脚本吧。
这个我只知道手动用工具导出。然后传到目标节点导入。这个可以自动化吗

还有就是,他是根据日期把数据搞出来,然后拼接成sql插入。插入完之后。他还要根据插入成功的这些sql的主键,反向去删除源端。

https://docs.pingcap.com/zh/tidb/stable/dumpling-overview#导出为-csv-文件

当你导出 CSV 文件时,你可以使用 --sql <SQL> 导出指定 SQL 选择出来的记录。

把sql写好,周期性的查当前时间500天前的时间就可以了。每天运行的脚本都不会变,设置一个crontab自动跑,把日志收集到一个指定目录。用脚本做一下管理,主要是判断dumpling日志有没有报错就好了。

lightning可以直接从csv文件做物理导入,逻辑导入。

3 个赞

dumping导出只要从日志判断是成功的,历史的就可以删除了,直接把dumping参数里面sql取出来,把select 这部分替换成 delete就是删除导出的部分了。shell/python做这些都不难。

。。。。导出来之后。还要去操作吧select改成delete吗。。感觉工作量好大。我感觉只能做到dumpling导出来之后然后去同步和删除分开两个job单独执行

我要是你们公司的研发,看到你这么说,我高低要找你理论半小时。
你一条sql改一半嫌工作量大,我接了你这个需求,吭哧吭哧搞半天,你还说我性能差。
必须要找个地方说说理。

恩我知道这个导出csv指定表筛选条件,这个等日后吧。等这个功能上线好之后。我再来研究这个方式导出导入。最后如果速度更快再来代替开发的同步。现在开发来操作 tidb同步从云上到本地。我这边是负责云上mysql数据同步到本地

哈哈 :joy:。我也感觉那个开发很辛苦。和他聊了很多呢,只能说尽量帮他解决一些其他问题吧。开发问题我也不懂。他本来就有一套同步数据的逻辑,复制一下,然后改写一下。

正常,这就不是他该干的事。
现有工具就能做。
我觉得你还是保持现状吧,反正我要是他,知道了是你对工具/脚本不熟悉造成的额外工作量,我可能会当场爆炸。 :joy:

哈哈。因为我之前测过好多次。mysql可以用otter工具来同步,tidb没什么办法,不要求实时,网络带宽只有2-3m/s,做dm cdc都不太行。dumping这个我研究过只想到了是要手动导出,然后手动传输到本地,再手动导入。 :joy:

脚本可以做到自动的,只是出了问题要上报的话,可能需要一个什么系统记录一下。要不就只能发邮件或者发微信群这样。

网络策略复杂一点的python就非常合适,什么ssh隧道了这些用起来都比较简单。不清楚怎么写的,可以直接chatgpt。问几个问题,调一调功能就差不多了。对代码结构的有追求,可能就有点额外的学习成本。只谈基本功能实现,现在python差不多就是chatgpt+调试就能解决。

1 个赞

py很少用,之前学过,但是实际操作过程中大部分都用shell写了。这个只能现在先把当前的功能上去吧。mysql同步删除。和tidb的删除历史数据先搞完。有时间了再去 研究tidb同步,或者就吧tidb部分让开发那边同步就行了。 :joy:

那你网络是瓶颈啊,不如导出数据来,然后压缩传送到目的地,然后再进行导入。