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