日期:2014-05-16  浏览次数:20823 次

MySQL Insert 效率问题请教
版本:5.0
表引擎: Myisam

每秒大于4000的数据量,

我采用insert into table(fld1....) values(),(),()...();

的方式进行insert.感觉速度上不去,每秒只能够1000条一点,上不了2000,

另外如果values()..();组合2000条insert 一次,速度反而没有200条insert 一次来得快。
一般大家会组合多少insert 一次呢?


大虾门帮忙支个招,什么方式insert 最快?
Load Data 速度会比这个更快嘛?

谢谢!

------解决方案--------------------
一般来讲,大数据量用INSERT INTO SELECT最快,
你将数据存入临时表中再INSET试试,
OR
打开事务,INSERT 完毕后再提交
------解决方案--------------------
看你的事务的默认设置模式,如果是打开的(经常如此 autocommit=1)。 
一次insert一条,则会立即提交,而一次insert into table(fld1....) values(),(),()...(); 会把多个数据做为一个事务,速度当然会慢。

如果数据量多,并且从逻辑上不是同一事务的话,建议逐条提交。大部分经验是每5条,或10条提交一次以获得最佳效率。


Load Data 会快一些,因为也是它的处理方式和SQL语句不同,直接通过mySQL的应用工具进行了记录的加载。

先insert 到临时表然后再insert into Select 是不是多余一步?
如果没有什么加工处理,不如直接insert 到目标表中。
------解决方案--------------------
但是插入临时表的本身不也是需要速度和时间的吗,这样楼上的意思就成了在数据和数据库之间增加了一个缓冲,但插入到临时表本身的时间就和插入到正式表中一样了,这一过程没没有优化大数据的插入效率啊

影响插入效率的因素很多啊

1.插入前可以将一些索引关闭,因为有索引的话,插入时要对索引值进行处理,这相当慢
alter table tablename disable keys;

2.并且将插入命令封闭成存储过程

3.根据我的经验,insert into...values(),好像没有insert into...set xxx=xxx快,当然后面的语法对其他数据库不兼容