记录一次接近24万条数据导入Mysql的过程

8 篇文章 0 订阅
4 篇文章 0 订阅

由于开发项目的需求,之前有部分数据要写入阿里云的表格存储,过了一年多时间,表A的数据量接近24万条,现在需要将表A的数据转到Mysql中。

利用官方工具导出数据后,发现文件里面有238999条数据,文件大小是460MB。

想了个流程:

  1. 按照表A的结构先在Mysql中创建对应的表格
  2. 文件先上传到OSS中,再从OSS中通过流方式读取回来,逐行回放,每10条发送一次到Mysql写入

说干就干,写好了程序,本地测试了小文件没有什么问题,放到服务器上的Docker中运行。

网卡打满,内存,CPU全部满载。失败告终。最终成果,只写入了1万多条数据。

总结了原因,读取OSS时用了公网,转成内网再试了一次,公网网卡不受影响了。内存,CPU照样全部满载。又是失败告终。

后来又想了个办法,将文件通过内网下载到Docker中,再用流读取方式,但是有个矛盾始终无法解决。就是控制流速的问题,试了response.data.on(‘data’, (chunk) => {})做等待,也是徒劳。

又尝试了某网友介绍的event-stream包,始终很好地控制流速,导致硬盘IO、内存、CPU全部满载,Mysql只写了几百条数据就失败了。

根据削峰填谷的思想,今天尝试了一个新方法,先将OSS上的数据按照准备写入Mysql的格式放到Redis里,Redis内存使用暴增400多M,之后逐条回放,操作成功就删除Redis上面的对应的数据,经过了差不多一个小时操作,数据入库成功,Redis内存使用量也恢复正常。写入的过程服务器和Mysql的监控显示CPU、内存、带宽、硬盘IO都比较平衡,重要的是没有影响其他服务。经过一个星期的试验和实践,算是完美解决了此问题。

服务器监控数据:
在这里插入图片描述
数据监控数据:
在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
MySQL是一款强大的关系型数据库管理系统,可以轻松地补全一天24小时的数据。 要补全24小时的数据,首先需要创建一个包含所有小时的时间戳表。可以使用以下语句创建一个包含24小时的时间戳表: ``` CREATE TABLE `timestamps` ( `id` int(11) NOT NULL AUTO_INCREMENT, `timestamp` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; ``` 然后使用以下语句将时间戳表填满24小时的时间戳: ``` INSERT INTO timestamps (timestamp) SELECT TIMESTAMP('2021-12-01', '00:00:00') + INTERVAL n HOUR FROM (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12 UNION SELECT 13 UNION SELECT 14 UNION SELECT 15 UNION SELECT 16 UNION SELECT 17 UNION SELECT 18 UNION SELECT 19 UNION SELECT 20 UNION SELECT 21 UNION SELECT 22 UNION SELECT 23) n; ``` 此时,可以使用时间戳表和其他需要补全数据的表进行联接,使用LEFT JOIN语句将时间戳表和需要补全数据的表按时间戳关联起来。这样,如果需要补全的数据缺失,则在联接结果中将显示NULL值。 例如,假设需要补全某一天内每个小时的销售额数据,可以使用以下语句: ``` SELECT timestamps.timestamp, sales.hourly_sales FROM timestamps LEFT JOIN sales ON DATE(timestamps.timestamp) = DATE(sales.timestamp) AND HOUR(timestamps.timestamp) = HOUR(sales.timestamp) WHERE timestamps.timestamp BETWEEN '2021-12-01 00:00:00' AND '2021-12-01 23:59:59'; ``` 通过以上方法,就可以轻松地补全一天24小时的数据
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lcwai

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值