昨晚遇到一个把百万条数据导入MySQL的问题,翻遍整个网络,最后找到了如下几种方法,这里先做个汇总!
- 直接导入 ;
- 用Load data infile导入;
- 使用存储过程批量导入;
- 更换引擎,让ENGINE=InnoDB为MyISAM,再导入;
- 合并单条SQL语句为多条,再导入;
- 利用事务进行有序的多次插入。
现在掌柜再依次对上面的各种方法进行一个介绍以及各种方***遇到的坑😂。
- 首先是直接导入,如果需要示例数据可以私掌柜。
PS:直接导入之前需要更改MySQL的数据导入权限,具体方法可以查看之前掌柜写的比较详细的一篇 ------>MySQL8.0版本以上的文件导入权限问题;此外已经新建表名为user_gender。
PPS:掌柜这里的MySQL是8.0.15版本!
不过掌柜一开始使用source直接导入的时候就遇到第一个坑👇报错如下:
有点纳闷?再三检查文件名没有写错啊,咋会打不开外部文件导入呢?
于是翻阅谷歌,在一个外国小哥的博客里面发现遇到同样的问题,于是往下一看,终于找到原因了:
是没有写对文件路径和最后多加了分号导致的。。。
use your_database;
SOURCE your_disk:/yourpath/user_gender1.sql
后来按👆上面的步骤和正确写法再次操作就成功导入了:
注意看右下角的开始时间是20:28,结果半个小时过去了,数据还在导入。。。
于是掌柜后来自动掐断,再随手查看这半小时导入了多少数据:
惨不忍睹!半小时才导入3万多条。。。这上百万的数据岂不是要一天???这怎么能忍!于是就有了开头的一番搜索。
- 下面来到第二种方法👉:使用Load data infile 导入。
依然一开始要更改导入权限,然后开始执行导入文件操作:
但是突然报错如上!👆,说不正确的整数值(ERROR1366: Incorrect integer value) ???成功get到了第二个坑👈。奇怪,明明要导入的文件打开就是整数:
后来掌柜再次搜索官方文档发现是由sql_mode这个所导致的,因为MySQL安装的时候是默认使用的严格SQL模式,所以对数据类型的验证要求很严格。
于是解决办法就是:更改sql_mode的值即可。
如果你不确定MySQL目前有哪些模式可以先查询一下:
上面两条命令都可以查询到目前你的sql包含哪些模式,第一个查询是全局查询;第二个是目前进程的查询。可以发现两个里面都有strict 这个模式存在,所以需要去掉它。
或者设置成空字符串也可以:
可以发现设置后再次查询sql_mode已经没有strict 模式了,现在再次用Load导入看看:
终于不再报错Incorrect,但是第三个坑又出现了🕳👆 ------> ERROR 1062(23000):Duplicate entry ‘0’ for key ‘PRIMARY’.
然后掌柜又去官方文档查看,发现官方说出现这样的情况是因为主键的问题,然后接着官方说如果在插入数据后面加入IGNORE,会产生警示但不报错,并且重复的键值不会插入。
显然掌柜这里并不能使用IGNORE方法,然后掌柜又去翻阅谷歌有同样情况的人是如何解决的,发现有些说用自增主键的方式可以解决!但是掌柜再看 这里 要导入的数据集并不符合这个方法。。. (打脸自己😂,今天发现就是在一开始创建表格的时候设置自增主键即可解决这个问题!!!
接着再次导入数据到表格:
终于成功导入了百万条数据,然后今天耗时42秒,比第一种方法确实快了不止100倍!!!!
(未完待续。。。)