Thinkphp大批量插入数据库的处理方法和速度对比


  最近在使用TP框架写一个读取excel数据并将其插入到mysql数据库中的小功能。当excel中的数据条数非常多(几千甚至上万),并且多很多个列,并且某些列的内容还非常多的时候就容易出现问题。

  第一种:(亲测)

  在for循环中使用普通的add()方法进行数据写入。耗时最多。

 

  第二种:

  使用事务提交,每个指定间隔下提交一次事务,分批写入的思路。效率尚可。

 

  第三种:(亲测)

  通过循环将每条要写入得数据都放在一个数组里面,然后使用TP自带的批量写入方法,addAll()方法进行数据更新。

  不过这种方法可能会遇到内存溢出的情况。

 

  第四种:(亲测有效)

  优化sql语句,将sql语句进行拼接,使用 insert into table_name (a, b ...) values (), () ...,然后 M()->execute($sql)执行插入。

  在这种情况下,可能会遇到“mysql gone away”的错误提示。

  可以通过修改mysql/bin/my.ini中的 max_allowed_packet 的值改解决。

  此种方法用时最少。

  

$sql = "insert into table_name (val1, val2) values ";
for($i=0; $i<100000; $i++){
    $sql .= "(2, 'abc'), ";      
}
$sql = substr($sql, 0, strlen($sql)-1);
M() -> execute($sql);

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM