mysql 执行大量insert语句

来源:互联网 发布:resnet网络结构全貌 编辑:程序博客网 时间:2024/05/12 01:58

鄙视


从其他地方拿到一些数据,形如:

INSERT INTO `alarm`(`id`,`ALARMKEY`,`ALARMNE`,`ALARMSOURCE`,`OPERATEOBJ`,`ALARMTYPEDEFINE`,`ALARMLEVEL`,`PATHNAME`,`SERVICEID`,`OCCURDATE`,`CLEARDATE`,`CLEARUSER`,`CONFIRMDATE`,`CONFIRMUSER`,`REMARK`,`ALARMCONFIRMTYPE`,`ALARMCLEARTYPE`,`ISSHIELD`,`FIRSTTIME`,`ALARMTIMES`)  VALUES ('2c9cc85244f8cdf20144fdaa693205e2', 'Mismerge', '\\ne=8', '\\ne=8\\pw=33619973', 'Y1731', '1', '5', 'bfd666', '\\pwt=1097', '2014-03-31 17:13:27', null, null, null, null, null, '0', '0', '\0', '2014-03-31 17:13:27', '1');

里面的数据至少有几万条。


如果直接一条一条执行

1、不能直接导入到MySQL客户端,直接死掉

2、耗费PC巨大的时间、空间


将insert语句组织成一下:

INSERT INTO `alarm`(`id`,`ALARMKEY`,`ALARMNE`,`ALARMSOURCE`,`OPERATEOBJ`,`ALARMTYPEDEFINE`,`ALARMLEVEL`,`PATHNAME`,`SERVICEID`,`OCCURDATE`,`CLEARDATE`,`CLEARUSER`,`CONFIRMDATE`,`CONFIRMUSER`,`REMARK`,`ALARMCONFIRMTYPE`,`ALARMCLEARTYPE`,`ISSHIELD`,`FIRSTTIME`,`ALARMTIMES`)  VALUES ('2c9cc85244f8cdf20144fdaa693205e2', 'Mismerge', '\\ne=8', '\\ne=8\\pw=33619973', 'Y1731', '1', '5', 'bfd666', '\\pwt=1097', '2014-03-31 17:13:27', null, null, null, null, null, '0', '0', '\0', '2014-03-31 17:13:27', '1'), ('2c9cc85244f8cdf20144fdaa693205e2', 'Mismerge', '\\ne=8', '\\ne=8\\pw=33619973', 'Y1731', '1', '5', 'bfd666', '\\pwt=1097', '2014-03-31 17:13:27', null, null, null, null, null, '0', '0', '\0', '2014-03-31 17:13:27', '1'), ('2c9cc85244f8cdf20144fdaa693205e2', 'Mismerge', '\\ne=8', '\\ne=8\\pw=33619973', 'Y1731', '1', '5', 'bfd666', '\\pwt=1097', '2014-03-31 17:13:27', null, null, null, null, null, '0', '0', '\0', '2014-03-31 17:13:27', '1'), ('2c9cc85244f8cdf20144fdaa693205e2', 'Mismerge', '\\ne=8', '\\ne=8\\pw=33619973', 'Y1731', '1', '5', 'bfd666', '\\pwt=1097', '2014-03-31 17:13:27', null, null, null, null, null, '0', '0', '\0', '2014-03-31 17:13:27', '1'), ('2c9cc85244f8cdf20144fdaa693205e2', 'Mismerge', '\\ne=8', '\\ne=8\\pw=33619973', 'Y1731', '1', '5', 'bfd666', '\\pwt=1097', '2014-03-31 17:13:27', null, null, null, null, null, '0', '0', '\0', '2014-03-31 17:13:27', '1');

减少sql语句的编译次数,可以极大提高工作效率,试了一下,插入8000条数据不费劲。


==============================================================================================


还有一个办法,时间多个insert语句打包到一个事务里面:

START TRANSACTION;  INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('0', 'userid_0', 'content_0', 0);  INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('1', 'userid_1', 'content_1', 1);  ...  COMMIT;

通过使用事务可以减少数据库执行插入语句时多次“创建事务,提交事务”的消耗,所有插入都在执行后才进行提交操作。这个方法参考了:http://blog.csdn.net/tigernorth/article/details/8094277,还未考证。


==============================================================================================



问题又来了,将几万条数据组织到一起,一个SQL语句规模还是很庞大,导入到MySQL,呃:


注意事项:

1. SQL语句是有长度限制,在进行数据合并在同一SQL中务必不能超过SQL长度限制,通过max_allowed_packe配置可以修改,默认是1M。

2. 事务需要控制大小,事务太大可能会影响执行的效率。MySQL有innodb_log_buffer_size配置项,超过这个值会日志会使用磁盘数据,这时,效率会有所下降。所以比较好的做法是,在事务大小达到配置项数据级前进行事务提交。



0 0