超大数据快速导入MySQL

一.问题背景

由于论文实验需要,现有下面两个需求.
1. 将1G的csv文件数据导入MySQL单表sample中,记录数2000w+;
2. 将上面的sample表中的数据迁移到远程数据库中.

二.解决方案

对于需求1,有如下解决方式.
1. 使用Navicat 工具栏中’数据导入’功能;
2. 使用编写Python/Perl脚本导入(未实现).
3. 使用MySQL的LOAD DATA INFILE命令,语法如下.

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
    [REPLACE | IGNORE]
    INTO TABLE tbl_name
    [PARTITION (partition_name [, partition_name] ...)]
    [CHARACTER SET charset_name]
    [{FIELDS | COLUMNS}
        [TERMINATED BY 'string']
        [[OPTIONALLY] ENCLOSED BY 'char']
        [ESCAPED BY 'char']
    ]
    [LINES
        [STARTING BY 'string']
        [TERMINATED BY 'string']
    ]
    [IGNORE number {LINES | ROWS}]
    [(col_name_or_user_var
        [, col_name_or_user_var] ...)]
    [SET col_name={expr | DEFAULT},
        [, col_name={expr | DEFAULT}] ...]

关于其中各参数的介绍见参考文献3[3]

对于需求2,有如下解决方式.
1. 使用FTP/SCP 或者WinSCP工具,将CSV文件压缩后发送到远程服务器,然后使用LOAD DATA INFILE 导入.
2. 使用 mysqldump[1];
3. 使用Navicat的数据传输.

三.实验环境

  • MySQL 5.6
  • Windows 7 32bit

四.实验结果

对于需求1,由于数据量很大,导致使用方法1时,电脑卡死,放弃.使用LOAD DATA,本地不到10分钟可将数据全部导入.

==注1:使用LOAD之前,需在MySQL中先创建目标表,建议添加一个自增ID列,方便统计记录数,字段顺序和CSV列的顺序保持一致.==

实验结果如图:
LOAD DATA

==注2: 最后一行类似(col1,col2,@col3,col4..)的语法是指定要插入的列,对于不想插入的列,用@col3表示.==

==注3:如果CSV文件列属性类型数据库中没有,就需要对该列进行处理(转换类型或者不插入这列)==

对于需求2,方法2和3耗时巨大,同样是LOAD DATA 最为高效.
图一为数据传输所花费时间:
数据传输
图二为LOAD所花费时间:
LOAD

五. 实验结论

LOAD DATA INFILE 数据导入功能是非常强大的,相对其他耗时最少.

参考文献

  1. Three methods to transfer a mysql database
  2. 13.2.6 LOAD DATA INFILE Syntax
  3. load的语法
  • 4
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值