最近工作有个任务:将接近8G的格式化文本文件插入本机的Mysql数据库,然后进行统计分析
因为之前没有操作过类似的入库操作,所以我先用一个3M的小文件进行模拟测试:
首先想到的是用Python进行IO读文件,然后逐行进行一一插入,代码截图如下:

执行发现5万多条数据,程序跑了1个多小时。
在数据库执行select (*) from gti_201806 发现每秒大概插入10行,简直就是龟速!
仔细研究代码后,发现执行流程:
readline读一行—>connet database —>insert value —> commit—>readline
流程里面insert value 每次只插入一行!!! 不慢才奇怪咧
所以第一次优化在insert 行数入手,查阅相关资料后采用python里 append[(),().....]累计行,executemany()进行批量插入,话不多说上代码:

执行结果缩减到6s,有了质的飞跃。但问题是还不够,3M的文件要6s,8G的文件岂不是1小时?不,直觉告诉我还可以更快,于是又费一番时间查阅资料,终于找到了一个官方宣称比insert操作快20倍的load data infile 命令,一番折腾后变成:

然后正当我踌躇满志的时候,结果出来了:1.5h
wtf官方骗人,不是说快的飞起吗?NO
冷静下来,仔细又查看了一下代码,发现可以不用Python,直接在本机搭建的MySQL执行sql命令即可,进一步优化其实是数据库参数、表结构的优化。于是参考了文章
https://blog.youkuaiyun.com/ciqingloveless/article/details/83507101blog.youkuaiyun.com进行了参数调整,成功执行了脚本:

最后插入约2833万条,用时10分钟。
binggo!只要功夫深,铁杵磨成针!
当然我相信还有更快的实现方式,譬如说多线程执行等等。
学无止境,加油吧!少年。
本文记录了作者在批量导入近8GB的文本数据到MySQL数据库过程中的优化历程。从初始的逐行插入导致的龟速,通过Python的executemany批量插入优化到6秒,再到使用LOAD DATA INFILE命令,最终通过调整数据库参数和表结构,实现了2833万条数据10分钟完成导入,展现了数据库性能调优的重要性。
1509

被折叠的 条评论
为什么被折叠?



