Mysql5.7 单表 500万数据迁移到新表的快速实现方案

开发过程中需要把一个已有500万条记录的表数据同步到另一个新表中,刚好体验下Mysql官方推荐的大数据迁移的方案:SELECT INTO OUTFILELOAD DATA INFILE

Mysql 关于导出-导入文件的方式处理数据的官方文档地址:Mysql官方文档


本机配置:
Win7 64位系统
内存: 16G
处理器:Intel i5-4460  3.2GHz
Mysql 5.7

导出到txt的语法:

SELECT a,b,a+b INTO OUTFILE '/tmp/result.txt'
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  LINES TERMINATED BY '\n'
  FROM test_table;

首先把现有表数据导出到txt文件中:
SELECT * INTO OUTFILE 'test_9.txt' FIELDS TERMINATED BY ';' FROM f_item s WHERE s.status=1;
在这里插入图片描述
我们看到导出510W+的数据到txt,耗时53秒,导出的txt文件大小1.18G左右
在这里插入图片描述

导入的命令语法:

LOAD DATA INFILE Syntax

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}] ...]

然后新建一个表来转存储这些数据,使用LOAD DATA INFILE 的方式导入:
LOAD DATA INFILE 'fxxxx_9.txt' INTO TABLE fxxxxtest FIELDS TERMINATED BY ';' (id, info_id, field_id, element_id, TYPE, @a, @a, @a, @a, @a, VALUE, @a, @a, create_user_id, create_time, @a, @a, @a, @a);
在这里插入图片描述我们看到导入总共510W+的数据,总共耗时6分51秒

注意到上面导入的时候,过滤了一些字段,这些字段在导出的原始表中有,但是新表中不需要,所有通过这种声明字段列表的方式,以@的方式过滤掉对应的字段。

这里还有个小插曲:
在我这个需求中还不是单纯的转移数据,还需要把新表里面的新增的几个字段内容填充,依赖的是另外一个有150多万条记录的关联表里面的字段内容。我一开始是按照上面的方式迁移原始数据过去新表后,在SQLyog工具里面直接通过命令来同步的,类似以下命令:
update table_pre pt, table_union ut set pt.A1 = ut.A1, pt.A2=ut.A2 where pt.union_id=pt.id and pt.status=1;
结果就这个同步过程(table_pre表数据510万+,table_union数据150万+)总共耗时1个多小时…

前面这方案总共耗时将近1.5 小时

后来想了下,如果直接在SELECT INTO OUTFILE 的时候就把相关联的字段一起保存到txt文件,然后再通过LOAD DATA INFILE 的方式一次性导入,岂不是可以一步到位?那这种实现耗时会不会更高效?
结果按照这种思路重新试了一次结果如下:

调整优化方案耗时:
导出到txt:约23分钟
导入表中:约7分钟
总共耗时:约0.5小时
相比上面最开始的方法,最后这个方式效率提高了,总耗时只是原来的30%

看来使用第三方工具倒腾数据还是效率比较慢的,当数据量超过1000W以后基本不可取,还是按照Mysql官方推荐的这种方式处理会好点。如果你有更好的方式,欢迎指点一二,谢谢。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值