(转载)超大数据快速导入MySQL

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dingding_12345/article/details/78646484
————————————————
版权声明:本文为CSDN博主「Deen12520」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/dingding_12345/article/details/78646484
一.问题背景
由于论文实验需要,现有下面两个需求.

  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}] ...]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
关于其中各参数的介绍见参考文献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列的顺序保持一致.==

实验结果如图:

20171127163809587.png

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

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

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

五. 实验结论

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

参考文献

  1. Three methods to transfer a mysql database
  2. 13.2.6 LOAD DATA INFILE Syntax
  3. load的语法

(仅供个人留存学习用)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。