当前位置:首页 > Mysql教程 > 列表

合理使用mysql中的load data infile导入数据

发布:smiling 来源: PHP粉丝网  添加日期:2014-09-25 16:23:48 浏览: 评论:0 

mysql中load data infile用来加载外部文件导入到mysql数据表中,针对于一般的小数据量的load data infile是没有问题,但如果碰到上亿级别数据怎么处理呢,下面我们一起来看看.

基本语法,代码如下:

  1. load data  [low_priority] [local] infile 'file_name txt' [replace | ignore
  2. into table tbl_name 
  3. [fields 
  4. [terminated by't'
  5. [OPTIONALLY] enclosed by ''
  6. [escaped by'' ]] 
  7. [lines terminated by'n'
  8. [ignore number lines] 
  9. [(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.phpfensi.com然后发现数据源有问题,需要取消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,作用是预热,这个时间数据竟然丢失了...

  1. innodb t1.sh 再次直接load. 
  2.  
  3. time mysql   test -e "load data local infile '/d01/huarong/cfi.txt' into table cfi" 
  4. [root@yw-0-0 huarong]# ./t1.sh  
  5. real    6m4.720s 
  6. user    0m0.492s 
  7. sys     0m2.213s 
  8.  
  9. innodb t2.sh不写binlog. 
  10. 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" 
  11. [root@yw-0-0 huarong]# ./t2.sh  
  12. real    5m3.964s 
  13. user    0m0.586s 
  14. sys     0m2.788s 
  15.  
  16. innodb t3.sh fifo,每次load 1M行数据。 
  17. wget http://www.maatkit.org/get/mk-fifo-split 
  18. perl ./mk-fifo-split ./cfi.txt --fifo /tmp/cfi.fifo --lines 1000000 
  19. while [ -e /tmp/cfi.fifo ]; do 
  20.         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" 
  21.    sleep 1; 
  22. done 
  23.  
  24. real: 5m25.84s 
  25. user: 0m2.197s 
  26. sys: 0m11.244s 
  27.  
  28.  
  29. myisam: t2.sh不写binlog 
  30. real    3m24.838s 
  31. user    0m0.626s 
  32. sys     0m2.939s

Tags: mysql导入数据 load data infile

分享到: