mysql 批量插入数据优化

1、把insert into tablename(c1,c2,c3)values(v1,v2,v3);insert into tablename(c1,c2,c3)value(v4,v5,v6);变更为insert into tablename(c1,c2,c3)values(v1,v2,v3),(v4,v5,v6);效率会快很多,在用到hibernate框架时,千万不要用hiberante的batchinsert,这个方法还是用的前面一种方法,只是一次性提交而已。


2、引擎MYZSAM的插入速度比InnerDB要快近20倍,但MYZSAM只支持表级锁,不支持行级锁,具体参考http://www.cnblogs.com/panfeng412/archive/2011/08/16/2140364.html


3、插入数据库前执行ALTER TABLE tbl_name DISABLE KEYS使索引无效,插入完成后执行ALTER TABLE tbl_name ENABLE KEYS使索引有效,这样插入的时间避免索引对插入造成影响。插入数据前执行set AUTOCOMMIT = 0;关闭自动任务提交,执行完后记得一定要执行commit命令,然后执行set AUTOCOMMIT = 1;命令。查看参数命令show variables;


4、锁定表可以加速用多个语句执行的INSERT操作,LOCK TABLES A WAIT;INSERT INTO tablename VALUES (v1,v2,v3),(v4,v5,v6);INSERT INTOtablename  VALUES (v1,v2,v3),(v4,v5,v6);UNLOCK TABLES;这样性能会提高,因为索引缓存区仅在所有INSERT语句完成后刷新到磁盘上一次。一般有多少INSERT语句即有多少索引缓存区刷新。如果能用一个语句插入所有的行,就不需要锁定。


5、使用LOAD DATA INFILE从文件中读取速度要比insert into tablename(c1,c2,c3)values(v1,v2,v3),(v4,v5,v6);形式快很多,使用方法为:

 LOAD DATA INFILE 'data.txt' INTO TABLE db2.gs_table;

 SELECT * INTO OUTFILE 'data.txt' FIELDS TERMINATED BY ',' FROM table2;是把表数据导入到文件;


6、使用DELAYED,延迟插入,当用户点击插入时,数据不会插入完后在返回给用户,即服务器把数据行放入一个队列中,并立即给客户端返回一个状态信息,这样客户端就可以在数据表被真正地插入记录之前继续进行操作了。语法为:insert DELAYED into  tablename(c1,c2,c3)values(v1,v2,v3),(v4,v5,v6);

你可能感兴趣的:(mysql 批量插入数据优化)