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语句,最后一次性插入。每批数据的处理都放在事务中。

原文地址:https://www.cnblogs.com/echoppy/p/8761662.html