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 intosql语句
    • 批量替换掉每行末尾的逗号分号
    • 同样因为这是基于文件导入的,要去掉所有的引号'",不能像我们在代码中习惯对字符串等类型加引号,否则引号也会被入库
    • 去掉数值前后的空格,否则字符串类型会把空格也入库,数值和日期类型无所谓(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每行插入一条记录
    • 数据按照逗号,分割
    • 需要先在命令行进入mysqluse 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
  • 没有去掉字符串前后的引号,把引号也入库了,由于写代码中字符串带习惯了,愣是半天没发现这个细节
  • 没有去掉字符串前后的空格,把空格也都导入了,一般很难发现

标签: load data infile, mysql