视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
合理使用mysql中的loaddatainfile导入数据_MySQL
2020-11-09 19:07:24 责编:小采
文档


bitsCN.com

基本语法:

load data [low_priority] [local] infile 'file_name txt' [replace | ignore]
into table tbl_name
[fields
[terminated by't']
[OPTIONALLY] enclosed by '']
[escaped by'' ]]
[lines terminated by'n']
[ignore number lines]
[(col_name, )]

load data infile语句从一个文本文件中以很高的速度读入一个表中。使用这个命令之前,mysqld进程(服务)必须已经在运行。为了安全原因,当读取位于服务器上的文本文件时,文件必须处于数据库目录或可被所有人读取。另外,为了对服务器上文件使用load data infile,在服务器主机上你必须有file的权限。


把千万级甚至亿级的数据写入mysql,实在是一件很让人头痛的事情。
load data local infile貌似是最快的方法了, 可是load一个亿级的文件,仍然需要数十分钟。

如果有主从结构的话,在主服务器上面load数十分钟,文件数据会写入binary log,再传输到从服务器,
然后从服务器也需要数十分钟来做load操作,如果从服务器只有一个sql_thread来执行binary log,那么在这数十分钟内,
从服务器就只能做这一个load操作,无法对后续的sql语句做出响应,导致主从之间的延迟有数十分钟。

而且,如果load了20分钟,www.111cn.net然后发现数据源有问题,需要取消load,那么mysql至少还要20分钟才能回滚成功…
这个时候非常无奈。

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

下面给出一些测试数据:

[root@yw-0-0 huarong]# wc -l cfi.txt
204227 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" www.111cn.net
[root@yw-0-0 huarong]# ./t2.sh
real 5m3.9s
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

更多详细内容请查看:http://www.111cn.net/database/mysql/56628.htm

bitsCN.com

下载本文
显示全文
专题