批量往mysql里面插入1000万条数据_Mysql入库优化历程

本文记录了作者在批量导入近8GB的文本数据到MySQL数据库过程中的优化历程。从初始的逐行插入导致的龟速,通过Python的executemany批量插入优化到6秒,再到使用LOAD DATA INFILE命令,最终通过调整数据库参数和表结构,实现了2833万条数据10分钟完成导入,展现了数据库性能调优的重要性。
部署运行你感兴趣的模型镜像

最近工作有个任务:将接近8G的格式化文本文件插入本机的Mysql数据库,然后进行统计分析

因为之前没有操作过类似的入库操作,所以我先用一个3M的小文件进行模拟测试:

首先想到的是用Python进行IO读文件,然后逐行进行一一插入,代码截图如下:

0ca4e1ddbe1d13b525a04fa1a57e6985.png

执行发现5万多条数据,程序跑了1个多小时。

在数据库执行select (*) from gti_201806 发现每秒大概插入10行,简直就是龟速!

仔细研究代码后,发现执行流程:

readline读一行—>connet database —>insert value —> commit—>readline

流程里面insert value 每次只插入一行!!! 不慢才奇怪咧

所以第一次优化在insert 行数入手,查阅相关资料后采用python里 append[(),().....]累计行,executemany()进行批量插入,话不多说上代码:

ade25643b4bb08c33505e15f18b587f1.png

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

7e949bc4412a0dd69029c1984ff336f3.png

然后正当我踌躇满志的时候,结果出来了:1.5h

wtf官方骗人,不是说快的飞起吗?NO

冷静下来,仔细又查看了一下代码,发现可以不用Python,直接在本机搭建的MySQL执行sql命令即可,进一步优化其实是数据库参数、表结构的优化。于是参考了文章

https://blog.youkuaiyun.com/ciqingloveless/article/details/83507101​blog.youkuaiyun.com

进行了参数调整,成功执行了脚本:

bc2255f0cd3d02fdbc0e81983538ace8.png

最后插入约2833万条,用时10分钟。

binggo!只要功夫深,铁杵磨成针!

当然我相信还有更快的实现方式,譬如说多线程执行等等。

学无止境,加油吧!少年。

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值