mysql批量插入数据优化
一.问题
很早以前做了一个更新功能,就是将A表中的数据全部查找出来,相对B表中改变的数据更新B表,B表中没有的数据插入B表。
最近发现该功能执行速率减慢,有时还跑超时。原来是A表中数据渐渐变多,就有了这个问题。
二.优化知识
1.循环每条插入改为一条语句插入多条。
即使用 insert into table () values (),(),(),()插入,如果字符串太长,可暂时设置 ini_set('memory_limit','1024M');
这是因为合并后日志量(MySQL的binlog和innodb的事务让日志)减少了,降低日志刷盘的数据量和频率,从而提高效率。通过合并SQL语句,同时也能减少SQL语句解析的次数,减少网络传输的IO。
2.在事务中进行插入处理
使用事务可以提高数据的插入效率,这是因为进行一个INSERT操作时,MySQL内部会建立一个事务,在事务内才进行真正插入处理操作。通过使用事务可以减少创建事务的消耗,所有插入都在执行后才进行提交操作
。
3.如果可以数据有序插入
这是因为由于数据库插入时,需要维护索引数据,无序的记录会增大维护索引的成本
4.分批次插入
三.解决
分批次取出数据,每批数据先做处理,有更新的更新,要插入的拼接成一条sql语句,最后一次性插入。每批数据的处理都放在事务中。