网站建设策划书心得,购买高仿手表网站,个人网站设计要求,成都网站建设cdajcx有时候我们需要将大量数据批量写入数据库#xff0c;直接使用程序语言和Sql写入往往很耗时间#xff0c;其中有一种方案就是使用MySql Load data infile导入文件的形式导入数据#xff0c;这样可大大缩短数据导入时间。 假如是从MySql客户端调用#xff0c;将客户端的文件导…有时候我们需要将大量数据批量写入数据库直接使用程序语言和Sql写入往往很耗时间其中有一种方案就是使用MySql Load data infile导入文件的形式导入数据这样可大大缩短数据导入时间。 假如是从MySql客户端调用将客户端的文件导入则需要使用 load local data infile. LOAD DATA INFILE 语句以很高的速度从一个文本文件中读取行到一个表中。文件名必须是一个文字字符串。 1开启load local data infile. 假如是Linux下编译安装 如果使用源码编译的MySQL在configure的时候需要添加参数--enable-local-infile 客户端和服务器端都需要否则不能使用local参数。 ./configure --prefix/usr/local/mysql --enable-local-infile make install 若是其它系统可在配置文件中配置 在MySql 配置文件My.ini文件中下面项中加入local-infile1 add: [mysqld] local-infile1 [mysql] local-infile1 客户端和服务端度需要开启对于客户端也可以在执行命中加上--local-infile1 参数 mysql --local-infile1 -uroot -pyourpwd yourdbname 如: 如/usr/local/mysql/bin/mysql -uroot -h192.168.0.2 -proot databaseName --local-infile1 -e LOAD DATA LOCAL INFILE data.txt into table test(name,sex) 2, 编码格式注意 若包含中文请保证导入文件、连接字符串、导入表都是UTF-8编码。 3执行 在使用LOAD DATA到MySQL的时候有2种情况 1在远程客户端需要添加选项--local-infile1导入远程客户端文本到MySQL需指定LOCAL默认就是ignore,加ignore选项会放弃数据加replace选项会更新数据都不会出现唯一性约束问题。 [zhuxuxentest9-vm1 tmp]$mysql -uzhuxu -pzhuxu test -h10.254.5.151 --local-infile1--show-warnings -v -v -v \ -e LOAD DATA LOCAL INFILE /tmp/2.txt INTO TABLE tmp_loaddata FIELDS TERMINATED BY ,; 2在本地服务器导入本地服务器文本到MySQL不指定LOACL出现唯一性约束冲突会失败回滚数据导入不进去这个时候就需要加ignore或者replace来导入数据。 mysqlLOAD DATA INFILE /home/zhuxu/1.txt INTO TABLE tmp_loaddata FIELDS TERMINATED BY ,; 4事务分析 步骤是这样的 1开启binlog设置binlog_formatrow执行reset master 2load data infile xxxxx 3查看binlog。 可以看出总共是一个事务也通过mysqlbinlog查看了binary log确认中间是被拆分成了多个insert形式。所以load data infile基本上是这样执行的 begin insert into values(),(),(),()... insert into values(),(),(),()... insert into values(),(),(),()... ... ... commit 当然由于row格式的binlog的语句并不是很明显的记录成多值insert语句它的格式时 insert into table set 1 set 2 ... set n insert into table set 1 set 2 ... set n insert ... ;注意这里有一个分号‘;’其实前面这一部分就相当于前面说的多值insert形式 然后接下来就重复上面的那种格式也就是一个load data infile 拆成了多个多值insert语句。 前面说的是row格式记录的load data infile那么对于statement是怎么样的呢statement格式的binlog它是这样记录的binlog中还是同样的load data语句但是在记录load data 语句之前它会先将你master上这个load data 使用到的csv格式的文件拆分成多个部分然后传到slave上在mysql的tmpdir下当然传这些csv格式的文件也会记录binlog event然后最后真正的SQL语句形式就是load data local infile /tmp/SQL_X_Y这种形式这里假设mysql的tmpdir是默认的/tmp实际上这样很危险比如tmpdir空间不够那就会报错。不过从效率上来说两者可能差不多因为statement格式的binlog也是拆分成了多个语句。 附 1load data infile 和 load local data infile 在 innodb和MyISAM 同步方面的区别 对MyISAM引擎 (1)对master服务器进行 ‘load’ 操作 (2)在master上所操作的load.txt文件会同步传输到slave上并在tmp_dir 目录下生成 load.txt文件 master服务器插入了多少就传给slave多少 (3)当master上的load操作完成后传给slave的文件也结束时 即在slave上生成完整的 load.txt文件 此时slave才开始从 load.txt 读取数据并将数据插入到本地的表中 对innodb引擎 (1)主数据库进行 ‘Load’ 操作 (2)主数据库操作完成后才开始向slave传输 load.txt文件 slave接受文件并在 tmp_dir 目录下生成 load.txt 文件 接受并生成完整的load.txt 后才开始读取该文件并将数据插入到本地表中 异常情况处理 1对MyISAM引擎 当数据库执行load,此时如果中断 Slave端将报错例如 #################################################################### Query partially completed on the master (error on master: 1053) and was aborted. There is a chance that your master is inconsistent at this point. If you are sure that your master is ok, run this query manually on the slave and then restart the slave with SET GLOBAL SQL_SLAVE_SKIP_COUNTER1; START SLAVE; . Query: LOAD DATA INFILE /tmp/SQL_LOAD-2-1-3.data IGNORE INTO TABLE test_1 FIELDS TERMINATED BY , ENCLOSED BY ESCAPED BY \\ LINES TERMINATED BY \n (id, name, address) ########################################################################################### 按照提示在slave服务器上 (1) 使用提示的load命令将主服务器传输过来的load文件在从服务器上执行 (2)让从服务器跳过错误。set global sql_slave_skip_counter1; (3)开启同步 2对Innodb引擎 由于innodb是事务型的所以会把load文件的整个操作当作一个事务来处理 中途中断load操作会导致回滚。 与此相关的一些参数 max_binlog_cache_size----能够使用的最大cache内存大小。 当执行多语句事务时max_binlog_cache_size如果不够大 系统可能会报出“Multi-statement transaction required more than max_binlog_cache_size bytes of storage”的错误。 备注以load data 来说如果load的文件大小为512M在执行load 的过程中 所有产生的binlog会先写入binlog_cache_size,直到load data 的操作结束后 最后再由binlog_cache_size 写入二进制日志如mysql-bin.0000008等。 所以此参数的大小必须大于所要load 的文件的大小或者当前所要进行的事务操作的大小。 max_binlog_size------------Binlog最大值一般设置为512M或1GB但不能超过1GB。 该设置并不能严格控制Binlog的大小尤其是Binlog遇到一根比较大事务时 为了保证事务的完整性不可能做切换日志的动作只能将该事务的所有SQL都记录进 当前日志直到事务结束 备注有时能看到binlog生成的大小超过了设定的1G。这就是因为innodb某个事务的操作比较大 不能做切换日志操作就全部写入当前日志直到事务结束。 2C# 批量插入Mysql
public void loadData(Connection connection)
{
long starTime System.currentTimeMillis();
String sqlString load data local infile ? into table test;
PreparedStatement pstmt;
try {
pstmt connection.prepareStatement(sqlString);
pstmt.setString(1, tfacts_result);
pstmt.executeUpdate();
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
long endTime System.currentTimeMillis();
System.out.println(program runs (endTime - starTime) ms);
}
public static void mysql_batch(string sqlStr,int point)
{
string sql insert into test(node1, node2, weight) values(?, ?, ?);
Connection conn getConn(mysql);
conn.setAutoCommit(false);
//clear(conn);
try
{
PreparedStatement prest conn.prepareStatement(sql);
//long a System.currentTimeMillis();
for (int x 1; x count; x)
{
prest.setInt(1, x);
prest.setString(2, 张三);
prest.addBatch();
if (x % point 0)
{
prest.executeBatch();
conn.commit();
}
}
prest.close();
//long b System.currentTimeMillis();
//print(MySql批量插入10万条记录, a, b, point);
}
catch (Exception ex)
{
ex.printStackTrace();
}
finally
{
close(conn);
} 使用into outfile 和 load data infile导入导出备份数据 如果要导出一个表中的部分字段或者部分符合条件的记录需要用到了mysql的into outfile 和 load data infile。例如下面的mysql命令是把select的mytable表中的数据导出到/home/db_bak2012文件。 select * from mytable where status!0 and name! into outfile /home/db_bak2012 fields terminated by | enclosed by lines terminated by \r\n ; 假如要导入刚才备份的数据可以使用load file方法例如下面的mysql命令把导出的数据导入了mytable_bak的表中 load data infile /home/db_bak2012 into table mytable_bak fields terminated by | enclosed by lines terminated by \r\n ; 这种方法的好处是导出的数据可以自己规定格式并且导出的是纯数据不存在建表信息你可以直接导入另外一个同数据库的不同表中相对于mysqldump比较灵活机动。 #基本语法
load data [low_priority] [local] infile file_name txt [replace | ignore]
into table tbl_name
[fields
[terminated byt]
[OPTIONALLY] enclosed by ]
[escaped by\ ]]
[lines terminated byn]
[ignore number lines]
[(col_name, )] load data infile语句从一个文本文件中以很高的速度读入一个表中。使用这个命令之前mysqld进程服务必须已经在运行。为了安全原因当读取位于服务器上的文本文件时文件必须处于数据库目录或可被所有人读取。另外为了对服务器上文件使用load data infile在服务器主机上你必须有file的权限。 1 如果你指定关键词low_priority那么MySQL将会等到没有其他人读这个表的时候才把插入数据。可以使用如下的命令load data low_priority infile /home/mark/data sql into table Orders; 2 如果指定local关键词则表明从客户主机读文件。如果local没指定文件必须位于服务器上。 3 replace和ignore关键词控制对现有的唯一键记录的重复的处理。如果你指定replace新行将代替有相同的唯一键值的现有行。如果你指定ignore跳过有唯一键的现有行的重复行的输入。如果你不指定任何一个选项当找到重复键时出现一个错误并且文本文件的余下部分被忽略。例如 load data low_priority infile /home/mark/data sql replace into table Orders; 4 分隔符 1 fields关键字指定了文件记段的分割格式如果用到这个关键字MySQL剖析器希望看到至少有下面的一个选项terminated by分隔符意思是以什么字符作为分隔符enclosed by字段括起字符escaped by转义字符 terminated by描述字段的分隔符默认情况下是tab字符\tenclosed by描述的是字段的括起字符。escaped by描述的转义字符。默认的是反斜杠backslash\ 例如load data infile /home/mark/Orders txt replace into table Orders fields terminated by, enclosed by ; 2lines 关键字指定了每条记录的分隔符默认为\n即为换行符 如果两个字段都指定了那fields必须在lines之前。如果不指定fields关键字缺省值与如果你这样写的相同 fields terminated by\t enclosed by ’ ‘ escaped by\\ 如果你不指定一个lines子句缺省值与如果你这样写的相同 lines terminated by\n 例如load data infile /jiaoben/load.txt replace into table test fields terminated by , lines terminated by /n; 5 load data infile 可以按指定的列把文件导入到数据库中。 当我们要把数据的一部分内容导入的时候需要加入一些栏目列/字段/field到MySQL数据库中以适应一些额外的需要。比方说我们要从Access数据库升级到MySQL数据库的时候 下面的例子显示了如何向指定的栏目(field)中导入数据load data infile /home/Order txt into table Orders(Order_Number, Order_Date, Customer_ID); 6 当在服务器主机上寻找文件时服务器使用下列规则1如果给出一个绝对路径名服务器使用该路径名。2如果给出一个有一个或多个前置部件的相对路径名服务器相对服务器的数据目录搜索文件。3如果给出一个没有前置部件的一个文件名服务器在当前数据库的数据库目录寻找文件。例如 /myfile txt”给出的文件是从服务器的数据目录读取而作为“myfile txt”给出的一个文件是从当前数据库的数据库目录下读取。 注意字段中的空值用\N表示 我的文章一般浅显易懂不会搞那么深入让大家很难理解。其实我水平也不咋样)LOAD DATA INFILE 一直被认为是MySQL很强大的一个数据导入工具因为他速度非常的快。不过有几个问题一定要注意1、编码。2、灵活导入导出。我来举两个例子说明一下。一、关于编码我们的示例文本文件我爱你,20,相貌平常经常耍流氓哈哈李奎,21,相貌平常经常耍流氓哈哈王二米,20,相貌平常经常耍流氓哈哈老三,24,很强老四,34,XXXXX老五,52,***%****小猫,45,中间省略。。。小狗,12,就会叫小妹,21,PP的很小坏蛋,52,表里不一上帝他爷,96,非常英俊MM来了,10,。。。歌颂党,20,社会主义好人民好,20,的确是好老高,10,学习很好斜三,60,眼睛斜了中华之子,100,威武的不行了大米,63,我爱吃苹果,15,好吃我们的示例表结构------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| Table | Create Table |------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| t0 | CREATE TABLE t0 ( id bigint(20) unsigned NOT NULL auto_increment, name char(20) NOT NULL, age tinyint(3) unsigned NOT NULL, description text NOT NULL, PRIMARY KEY (id), UNIQUE KEY idx_name (name)) ENGINEMyISAM DEFAULT CHARSETutf8 | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------1 row in set (0.00 sec)我们把这个文本文件从WINDOWS 下COPY到LINUX下看看mysql load data infile /tmp/t0.txt ignore into table t0 character set gbk fields terminated by , enclosed by lines terminated by \n (name,age,description);Query OK, 19 rows affected (0.01 sec)Records: 19 Deleted: 0 Skipped: 0 Warnings: 0mysql select * from t0;-----------------------------------------------| id | name | age | description |-----------------------------------------------| 1 | 我爱你 | 20 | 相貌平常经常耍流氓哈哈 | | 2 | 李奎 | 21 | 相貌平常经常耍流氓哈哈 | | 3 | 王二米 | 20 | 相貌平常经常耍流氓哈哈 | | 4 | 老三 | 24 | 很强 | | 5 | 老四 | 34 | XXXXX | | 6 | 老五 | 52 | ***%**** | | 7 | 小猫 | 45 | 中间省略。。。 | | 8 | 小狗 | 12 | 就会叫 | | 9 | 小妹 | 21 | PP的很 | | 10 | 小坏蛋 | 52 | 表里不一 | | 11 | 上帝他爷 | 96 | 非常英俊 | | 12 | MM来了 | 10 | 。。。 | | 13 | 歌颂党 | 20 | 社会主义好 | | 14 | 人民好 | 20 | 的确是好 | | 15 | 老高 | 10 | 学习很好 | | 16 | 斜三 | 60 | 眼睛斜了 | | 17 | 中华之子 | 100 | 威武的不行了 | | 18 | 大米 | 63 | 我爱吃 | | 19 | 苹果 | 15 | 好吃 | -----------------------------------------------19 rows in set (0.00 sec)我来说明一下相关的参数关于我的导入语句我现在直说两个其他的参考手册。character set gbk;这个字符集一定要写要不然就会乱码或者只导入一部分数据。ignore into table 因为name 列加了唯一索引加这个是为了避免重复数据插入报错。加入我们再次运行这个导入语句就会发现Query OK, 0 rows affected (0.00 sec)Records: 19 Deleted: 0 Skipped: 19 Warnings: 0没有任何值导入因为里面已经有了相同的值。这里也可以用replace into tableMySQL会把相同的先干掉再插入新的值。mysql load data infile /tmp/t0.txt replace into table t0 character set gbk fields terminated by , enclosed by lines terminated by \n (name,age,description);Query OK, 38 rows affected (0.00 sec)Records: 19 Deleted: 19 Skipped: 0 Warnings: 0mysql select * from t0;-----------------------------------------------| id | name | age | description |-----------------------------------------------| 20 | 我爱你 | 20 | 相貌平常经常耍流氓哈哈 | | 21 | 李奎 | 21 | 相貌平常经常耍流氓哈哈 | | 22 | 王二米 | 20 | 相貌平常经常耍流氓哈哈 | | 23 | 老三 | 24 | 很强 | | 24 | 老四 | 34 | XXXXX | | 25 | 老五 | 52 | ***%**** | | 26 | 小猫 | 45 | 中间省略。。。 | | 27 | 小狗 | 12 | 就会叫 | | 28 | 小妹 | 21 | PP的很 | | 29 | 小坏蛋 | 52 | 表里不一 | | 30 | 上帝他爷 | 96 | 非常英俊 | | 31 | MM来了 | 10 | 。。。 | | 32 | 歌颂党 | 20 | 社会主义好 | | 33 | 人民好 | 20 | 的确是好 | | 34 | 老高 | 10 | 学习很好 | | 35 | 斜三 | 60 | 眼睛斜了 | | 36 | 中华之子 | 100 | 威武的不行了 | | 37 | 大米 | 63 | 我爱吃 | | 38 | 苹果 | 15 | 好吃 | -----------------------------------------------19 rows in set (0.00 sec)(name,age,description);这些也就是具体的表属性了指明这个就可以导入想要的数据。2、关于灵活性其实也就是一个记录功能如果想在导入的时候记录一下导入的具体时间怎么办我们来看看先加一个时间属性记录导入时间。mysql alter table t0 add update_time timestamp not null;Query OK, 19 rows affected (0.00 sec)Records: 19 Duplicates: 0 Warnings: 0干掉唯一索引mysql alter table t0 drop index idx_name;Query OK, 19 rows affected (0.00 sec)Records: 19 Duplicates: 0 Warnings: 0mysql load data infile /tmp/t0.txt into table t0 character set gbk fields terminated by , enclosed by lines terminated by \n (name,age,description) set update_timecurrent_timestamp;Query OK, 19 rows affected (0.00 sec)Records: 19 Deleted: 0 Skipped: 0 Warnings: 0mysql select * from t0;--------------------------------------------------------------------| id | name | age | description | update_time |--------------------------------------------------------------------| 20 | 我爱你 | 20 | 相貌平常经常耍流氓哈哈 | 0000-00-00 00:00:00 | …………| 24 | 老四 | 34 | XXXXX | 0000-00-00 00:00:00 | | 25 | 老五 | 52 | ***%**** | 0000-00-00 00:00:00 | …………| 35 | 斜三 | 60 | 眼睛斜了 | 0000-00-00 00:00:00 | | 36 | 中华之子 | 100 | 威武的不行了 | 0000-00-00 00:00:00 | …………| 60 | 王二米 | 20 | 相貌平常经常耍流氓哈哈 | 2008-06-30 14:58:37 | …………| 68 | 上帝他爷 | 96 | 非常英俊 | 2008-06-30 14:58:37 | | 69 | MM来了 | 10 | 。。。 | 2008-06-30 14:58:37 | …………| 75 | 大米 | 63 | 我爱吃 | 2008-06-30 14:58:37 | | 76 | 苹果 | 15 | 好吃 | 2008-06-30 14:58:37 | --------------------------------------------------------------------38 rows in set (0.00 sec)新导入的19条记录时间被记录了下来。只是之前的数据库没有记录不过现在不需要这些重复数据了。干掉他就可以了mysql alter table t0 order by id desc;Query OK, 38 rows affected (0.01 sec)Records: 38 Duplicates: 0 Warnings: 0mysql alter ignore table t0 add unique index idx_name (name);Query OK, 38 rows affected (0.00 sec)Records: 38 Duplicates: 19 Warnings: 0mysql alter table t0 order by id asc;Query OK, 19 rows affected (0.01 sec)Records: 19 Duplicates: 0 Warnings: 0mysql select * from t0;--------------------------------------------------------------------| id | name | age | description | update_time |--------------------------------------------------------------------| 58 | 我爱你 | 20 | 相貌平常经常耍流氓哈哈 | 2008-06-30 14:58:37 | | 59 | 李奎 | 21 | 相貌平常经常耍流氓哈哈 | 2008-06-30 14:58:37 | | 60 | 王二米 | 20 | 相貌平常经常耍流氓哈哈 | 2008-06-30 14:58:37 | | 61 | 老三 | 24 | 很强 | 2008-06-30 14:58:37 | | 62 | 老四 | 34 | XXXXX | 2008-06-30 14:58:37 | | 63 | 老五 | 52 | ***%**** | 2008-06-30 14:58:37 | | 64 | 小猫 | 45 | 中间省略。。。 | 2008-06-30 14:58:37 | | 65 | 小狗 | 12 | 就会叫 | 2008-06-30 14:58:37 | | 66 | 小妹 | 21 | PP的很 | 2008-06-30 14:58:37 | | 67 | 小坏蛋 | 52 | 表里不一 | 2008-06-30 14:58:37 | | 68 | 上帝他爷 | 96 | 非常英俊 | 2008-06-30 14:58:37 | | 69 | MM来了 | 10 | 。。。 | 2008-06-30 14:58:37 | | 70 | 歌颂党 | 20 | 社会主义好 | 2008-06-30 14:58:37 | | 71 | 人民好 | 20 | 的确是好 | 2008-06-30 14:58:37 | | 72 | 老高 | 10 | 学习很好 | 2008-06-30 14:58:37 | | 73 | 斜三 | 60 | 眼睛斜了 | 2008-06-30 14:58:37 | | 74 | 中华之子 | 100 | 威武的不行了 | 2008-06-30 14:58:37 | | 75 | 大米 | 63 | 我爱吃 | 2008-06-30 14:58:37 | | 76 | 苹果 | 15 | 好吃 | 2008-06-30 14:58:37 | --------------------------------------------------------------------19 rows in set (0.00 sec)现在是达到了目的了为啥中途要干掉唯一索引呢因为set 语法 再有IGNORE 的时候会忽略掉。 mysql load data 导出、导入 csv #用mysql导出时如果文件目录没有权限可以将文件导出到 mysql 库所在的服务器上的 /tmp/ 目录下推荐span/span
select * from s_reviews where stars 0 limit 10 into outfile /tmp/reviews.csv fields terminated by , optionally enclosed by escaped by lines terminated by \n; #从csv文件导入数据导入的时候span/spanspan/span可以将要导入的文件先复制到 mysql 库所在的服务器上的 /tmp/ 目录下推荐span/span。
要将csv文件的字段和mysql表中的字段对应起来以免出错同时也可以提醒自己导入的是哪些数据
nbsp;LOAD DATA LOCAL INFILE /tmp/reviews.csv INTO TABLE s_reviews fields terminated by , optionally enclosed by escaped by lines terminated by \n (id, user_id, user_name, shop_id, shop_name, arv_price, environment, taste_or_product, service, comment_type, comment, stars, review_time, fetch_time); 转载于:https://www.cnblogs.com/conanwang/p/5890753.html