最近在使用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);