在工作中遇到了需要大批量的更新同步數據,首先用了個笨方法測試,那就是for循環插入與更新。由於數據是從另外一個大型網站的接口中獲取的,我本地需要進行處理后,再進行更新與判斷,程序執行完成之后,發現耗時太長,僅僅五千條數據就耗時了五個小時左右,非常耗時間。
在進行更新與插入的操作的時候,我們首先必須考慮到文件執行時間的問題。當php文件執行時間過長時,服務器會終止該文件的執行,所以我們要么更改php.ini配置,要么在文件開頭加上下列代碼:
set_time_limit(0); //取消腳本執行延時上限
ignore_user_abort(TRUE); //如果客戶端斷開連接,不會引起腳本abort
另外我們在獲取數據以及對數據進行處理的時候,可能會造成數據亂碼或者編碼格式錯誤,在開頭加上設置編碼格式的代碼,如下:
header("content-type:text/html;charset=utf-8");
下面我們來進行插入的實例操作:
方法一:根據資料顯示,可以進行事務處理操作,經過測試,時間確實縮短了,五千條數據大概一個多小時全部處理完畢,時間縮短了一大半。但是這方法必要要求是(該數據庫支持事務處理),重中之重
示例代碼如下:
$connect_mysql->query(‘BEGIN');
$params=array(‘value'=>'50′);
for($i=0;$i<2000000;$i++){
$connect_mysql->insert($params);
if($i%100000==0){
$connect_mysql->query(‘COMMIT');
$connect_mysql->query(‘BEGIN');
}
}
$connect_mysql->query(‘COMMIT');
該方法需要注意的是:
1.每次rollback或者commit之后加上begin,否則下次循環將不會開啟事務
2.在循環結束后,加上commit,否則可能會有開啟的事務未commit或者rollback,會造成數據庫錯誤:1025-lock wait timeout exceeded;try restarting transaction
方法二:對sql語句進行拼接,最后統一插入。
代碼示例如下:
$sql= “insert into twenty_million (value) values”;
for($i=0;$i<2000000;$i++){
$sql.=”('50′),”;
};
$sql=substr($sql,0,strlen($sql)-1);
$connect_mysql->query($sql);
該方法的主要耗時是在程序數據的處理上,減少了與數據庫的連接與操作,而我們知道程序的短板和主要耗時都是在數據庫上,該方法確實有效地減少了程序執行的時間,我們在使用的時候可以使用該方法
但是必須注意的是,該方法語句的字段必須正確,並且與值對應,不能有錯誤的值,否則插入會失敗
下面是對於數據批量更新的操作,下列方法真的讓人受益良多,打開新知識的大門
方法一:該方法根據資料所述,實際上是將對應的數據先進行delete,再進行insert,如果更新的字段不全會將缺失的字段設置為缺省值,這個在實際工作中要注意,很危險