MySQL导入大数据load data infile的总结
需求
经常为了测试某个功能,需要大量数据测试
步骤
先用python跑出一个纯sql语句的脚本
- phpmyadmin导入,文件太大,需要修改apache(如果没有权限呢)
- mysql命令行导入,会报错行数太多,需要修改配置(万一又没有权限呢)
INSERT INTO `_statsstandard` (`ID`, `day`, `typename`, `typeid`, `Location`, `shows`, `clicks`, `uniqueshows`, `uniqueclicks`) VALUES
(2766484, '2013-01-01', 'C', 100101, '', 405, 278, 37, 7),
(2766485, '2013-01-02', 'C', 100101, '', 291, 180, 41, 10),
(2766486, '2013-01-03', 'C', 100101, '', 462, 128, 76, 15),
(2766487, '2013-01-04', 'C', 100101, '', 472, 307, 76, 70)
....
需要把sql文件数据批量改一下
infile
,顾名思义就是基于文件
的,所以文件后缀是不是sql
都无所谓- 删除第一行
insert into
的sql
语句 - 批量替换掉每行末尾的
逗号
和分号
- 同样因为这是基于文件导入的,要去掉所有的引号
'
和"
,不能像我们在代码中习惯对字符串等类型加引号,否则引号也会被入库 - 去掉数值前后的
空格
,否则字符串类型会把空格也入库,数值和日期类型无所谓(mysql会自动转换,最好也去掉稳妥) 说明:
如果第一列的ID为自增,则为空就好(用NULL
代替我测试有中文乱码问题,有知道的朋友可以评论中告知解决办法)
2766484, 2013-01-01, C, 100101, , 405, 278, 37, 7
2766485, 2013-01-02, C, 100101, , 291, 180, 41, 10
2766486, 2013-01-03, C, 100101, , 462, 128, 76, 15
2766487, 2013-01-04, C, 100101, , 472, 307, 76, 70
2766488, 2013-01-05, C, 100101, , 279, 251, 91, 45
借助mysql的命令
load data infile
- 数据顺序和表中字段顺序对应
- 按换行符
\r\n
分割对sql每行插入一条记录 - 数据按照逗号
,
分割 - 需要先在命令行进入
mysql
并use database_name
后执行 - 测试
20万
行的数据,1秒
钟搞定
load data infile '~/sql_insert.sql' into table _statsstandard fields terminated by ',' optionally enclosed by "'" lines terminated by '\r\n';
注意事项(吃过的亏)
- 没有去掉日期类型的前后
引号
,日期在数据库中的类型是date
,所以导致导入后全是0000-00-00
- 没有去掉字符串前后的
引号
,把引号也入库了,由于写代码中字符串带习惯了,愣是半天没发现这个细节 - 没有去掉字符串前后的
空格
,把空格也都导入了,一般很难发现
- 上一篇: Markdown的代码高亮
- 下一篇: textarea的Tab缩进