使用MySQL的SELECT INTO OUTFILE 、Load data file

LOAD DATA INFILE语句从一个文本文件中以很高的速度读入一个表中。当用户一前一后地使用SELECT ... INTO OUTFILE 和LOAD DATA INFILE 将数据从一个数据库写到一个文件中,然后再从文件中将它读入数据库中时,两个命令的字段和行处理选项必须匹配。否则,LOAD DATA INFILE 将不能正确地解释文件内容。

假设用户使用SELECT ... INTO OUTFILE 以逗号分隔字段的方式将数据写入到一个文件中:

  1. SELECT * INTO OUTFILE 'data.txt' FIELDS TERMINATED BY ',' FROM table2;

为了将由逗号分隔的文件读回时,正确的语句应该是:

  1. LOAD DATA INFILE 'data.txt' INTO TABLE table2 FIELDS TERMINATED BY ',';

如果用户试图用下面所示的语句读取文件,它将不会工作,因为命令LOAD DATA INFILE 以定位符区分字段值:

  1. LOAD DATA INFILE 'data.txt' INTO TABLE table2 FIELDS TERMINATED BY '\t';

下面是我用来导入导出的命令:

  1. select * into outfile 'ddd.txt' fields terminated by ',' from dn_location;
  2. load data infile 'ddd.txt' into table dn_location2  FIELDS TERMINATED BY ',';

通过该方法导出的数据,是将各字段(只有数据,不导出表结构)数据存在一个文件中,中间以逗号分隔,因为文件中并不包含数据库名或者表名,因此需要在导入导出的时候些明确。该方法在18分钟内导出1.6亿条记录,46min内导入6472W条记录,平均速度:8442W条/h。mysql官方文档也说明了,该方法比一次性插入一条数据性能快20倍。

【额外测试1】在新的表结构中增加主键,并增加某一列自增,查看主键索引对插入效率的影响

【结论】导出效率没有变化,导入效率35min中导入4600W条记录,平均速度:7886W/h,考虑到测试次数很少,不能直接下结论,但至少明确该操作不会有明显的效率下降。

【测试语句】

  1. SELECT MOTOR_ID,LAT,LON,UPLOADTIME,RECEIVETIME,STATE_ID,SYS_STATE_ID,SPEED,DIR,A,GPRS,DISTANCE,WEEKDAY,GPSLOCATE  INTO OUTFILE 'import2.txt' FROM dn_location3;
  2. LOAD DATA INFILE 'import2.txt' INTO TABLE dn_location_withkey(MOTOR_ID,LAT,LON,UPLOADTIME,RECEIVETIME,STATE_ID,SYS_STATE_ID,SPEED,DIR,A,GPRS,DISTANCE,WEEKDAY,GPSLOCATE);

【额外测试2】在新建的表中对一个varchar类型字段增加索引,再往里导入数据,查看对插入效率的影响。

【结论】导入4600W条记录耗时47min,效率确实有所降低,比仅有主键索引的测试多了12分钟,从这里看插入效率排序: 没有任何索引 > 主键索引  >  主键索引+其他索引。

【额外测试3】在新建表中不加索引导入数据,完全导入后再建索引,查看建立索引时间

【结论】(1)表数据4600W,建立索引时间10min;表数据1.6亿条,建立索引时间41min,由此可见建立索引的时间与表的数据量有直接关系,其他影响因素比较少;(2)从此处看先插入数据再建索引与先建索引再批量插入数据时间上差距不大,前者稍快一些,开发中应根据实际情况选择。

(3)使用mysqldump ,source

  1. mysqldump -u root -p -q -e -t  webgps4 dn_location2 > dn_location2.sql
  2. mysqldump -u root -p -q -e -t --single-transaction  webgps4 dn_location2 > dn_location2.sql
  3. source dn_location2.sql

以上是导入导出数据的语句,该方法15分钟导出1.6亿条记录,导出的文件中平均7070条记录拼成一个insert语句,通过source进行批量插入,导入1.6亿条数据耗时将近5小时。平均速度:3200W条/h。后来尝试加上--single-transaction参数,结果影响不大。另外,若在导出时增加-w参数,表示对导出数据进行筛选,那么导入导出的速度基本不变,筛选出的数据量越大,时间越慢而已。对于其中的参数这里进行说明:

–quick,-q

该选项在导出大表时很有用,它强制 mysqldump 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中。

--extended-insert, -e

使用具有多个VALUES列的INSERT语法。这样使导出文件更小,并加速导入时的速度。默认为打开状态,使用--skip-extended-insert取消选项。

--single-transaction

该选项在导出数据之前提交一个BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于多版本存储引擎,仅InnoDB。本选项和--lock-tables 选项是互斥的,因为LOCK TABLES 会使任何挂起的事务隐含提交。要想导出大表的话,应结合使用--quick 选项。在本例子中没有起到加快速度的作用

mysqldump -uroot -p --host=localhost --all-databases --single-transaction

-t 仅导出表数据,不导出表结构

使用MySQL的SELECT INTO OUTFILE ,Load data file,Mysql 大量数据快速导入导出的更多相关文章

  1. Mysql --学习:大量数据快速导入导出

    声明:此文供学习使用,原文:https://blog.csdn.net/xiaobaismiley/article/details/41015783 [实验背景] 项目中需要对数据库中一张表进行重新设 ...

  2. spark load data from mysql

    spark load data from mysql code first 本机通过spark-shell.cmd启动一个spark进程 SparkSession spark = SparkSessi ...

  3. mysql 数据到 导入导出 总结

    数据库数据的导入和导出受secure_file_priv配置项影响#限制导入导出,null时无法进行数据的导入导出,空时不限制,设置了目录则只能对该目录下的文件进行导入导出show variables ...

  4. MySQL数据表格导入导出

    一 初始数据(共6条记录) username userpwd age admin admin 18 root root 18 cat cat 17 dog dog 15 dog1 dog1 15 zh ...

  5. 54.超大数据快速导入MySQL

    超大数据快速导入MySQL  ----千万级数据只需几十分钟本地测试方法1.首先需要修改本地mysql的编码和路径,找到my.ini.2.在里面添加或修改 character-set-server=u ...

  6. 【转载】Mysql load data infile用法(万级数据导入,在几秒之内)

    https://blog.csdn.net/u014082714/article/details/53173975 http://blog.itpub.net/26506993/viewspace-2 ...

  7. mysql数据的导入导出

    2017-12-15       一. mysqldump工具基本用法,不适用于大数据备份   1. 备份所有数据库: mysqldump -u root -p --all-databases > ...

  8. MySQL 表数据的导入导出

    数据导出 1.  使用 SELECT ...INTO OUTFILE ...命令来导出数据,具体语法如下. mysql> SELECT * FROM tablename INTO OUTFILE ...

  9. mysql快速导入导出数据

    --导入 select * from inhos_genoperation(表名) where UPLOAD_ORG_CODE='***' into outfile '/tmp/inhos_genop ...

随机推荐

  1. prometheus(4)之alertmanager报警插件

    报警处理流程如下: 1. Prometheus Server监控目标主机上暴露的http接口(这里假设接口A),通过Promethes配置的'scrape_interval'定义的时间间隔,定期采集目 ...

  2. 【Java】IO流

    File类 介绍 File类的一个对象,代表一个文件或一个文件目录 File类声明在java.io包下 File类中涉及关于文件或文件目录的创建.删除.重命名.修改时间.文件大小等方法,并未涉及到写入 ...

  3. Xshell Error Report,Program has stopped working

    xftp和xshell突然都无法运行并报错如图 图中的意思是,xshell有错误,官方想收集错误.可是也不能给你发送了,还这样啊. 解决办法 1.卸载Xshell和Xftp,重新安装. 参考:http ...

  4. yum install hadoop related client

    yum list avaliable hadoop\* yum list installed yum repolist repo is in /etc/yum.repos.d yum install ...

  5. Java经典面试题(二)-不古出品

    @ 目录 1. 为什么说 Java 语言"编译与解释并存"? 2.Oracle JDK 和 OpenJDK 的对比? 3.字符型常量和字符串常量的区别? 4.Java 泛型了解么? ...

  6. RabbitMQ 线上事故!慌的一批,脑袋一片空白。。。

    前言 那天我和同事一起吃完晚饭回公司加班,然后就群里就有人@我说xxx商户说收不到推送,一开始觉得没啥.我第一反应是不是极光没注册上,就让客服通知商户,重新登录下试试.这边打开极光推送的后台进行检查. ...

  7. 【JAVA】编程(4)---摇色子

    作业要求: 利用" Math.random ( )  "生成随机数的方法来模拟同时摇三个色子获得的点数:点数的多少不同,也会导致不同的输出结果:可适当对程序增添一些更有趣的功能: ...

  8. c++学习笔记(七)

    位运算和sizeof运算符 位运算 C语言中提供了一些运算符可以直接操作整数的位,称为位运算,因此位运算中的操作数都必须是整型的. 位运算的效率是比较高的,而且位运算运用好的话会达到意想不到的效果. ...

  9. vue + cesium开发(5) 搭建 vue + cesium开发环境(2)

    上vue+cesium开发(1)中,没有进行配置webpack,而是使用了插件进行代替,在使用过程中出现了一些未知BUG,影响体验,因此参考了官方文档对项目进行重新配置,使用了 copy-webpac ...

  10. [cf1515G]Phoenix and Odometers

    显然这条路径只能在$v_{i}$所在的强连通分量内部,不妨仅考虑这个强连通分量 对这个强连通分量dfs,得到一棵外向树(不妨以1为根) 考虑一条边$(u,v,l)$,由于强连通,总存在一条从$v$到$ ...