mysql load data into_合理地 load data into mysql

把千万级甚至亿级的数据写入mysql,实在是一件很让人头痛的事情。

load data local infile貌似是最快的方法了, 可是load一个亿级的文件,仍然需要数十分钟。

如果有主从结构的话,在主服务器上面load数十分钟,文件数据会写入binary log,再传输到从服务器,

然后从服务器也需要数十分钟来做load操作,如果从服务器只有一个sql_thread来执行binary log,那么在这数十分钟内,

从服务器就只能做这一个load操作,无法对后续的sql语句做出响应,导致主从之间的延迟有数十分钟。

而且,如果load了20分钟,然后发现数据源有问题,需要取消load,那么mysql至少还要20分钟才能回滚成功…

这个时候非常无奈。

所以有必要把这种大文件拆分成若干个小文件,然后分别load.

下面给出一些测试数据:

[root@yw-0-0 huarong]# wc -l cfi.txt

20894227 cfi.txt, 行数20M

有九个字段,varchar(255),没有key。

文件大小 4,078,099,848 (3.8G),每行平均195字节。

t1.sh 直接load,作用是预热。

这个时间数据竟然丢失了...

innodb t1.sh 再次直接load

time mysql test -e "load data local infile '/d01/huarong/cfi.txt' into table cfi"

[root@yw-0-0 huarong]# ./t1.sh

real 6m4.720s

user 0m0.492s

sys 0m2.213s

innodb t2.sh不写binlog.

time mysql test -e "set foreign_key_checks=0; set sql_log_bin=0; set unique_checks=0; load data local infile '/d01/huarong/cfi.txt' into table cfi"

[root@yw-0-0 huarong]# ./t2.sh

real 5m3.964s

user 0m0.586s

sys 0m2.788s

innodb t3.sh fifo,每次load 1M行数据。

wget http://www.maatkit.org/get/mk-fifo-split

perl ./mk-fifo-split ./cfi.txt --fifo /tmp/cfi.fifo --lines 1000000

while [ -e /tmp/cfi.fifo ]; do

time mysql test -e "set foreign_key_checks=0; set sql_log_bin=0; set unique_checks=0; load data local infile '/tmp/cfi.fifo' into table cfi"

sleep 1;

done

real: 5m25.84s

user: 0m2.197s

sys: 0m11.244s

myisam: t2.sh不写binlog

real 3m24.838s

user 0m0.626s

sys 0m2.939s

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值