PHP 優化筆記-SQL 可以一次寫入就不要分批寫入
在一開始寫 php + sql 的時候因為案子都不大,因此對於資料庫存取速度幾乎都靠系統速度暴力硬上,反正也感受不出差異。
在一次幫朋友寫一個臨時性的專案中發現一個問題:當資料筆數很大時,資料庫輸入的速度會變得很慢。
從這當中查到的問題是硬碟不斷的在讀寫,於是寫了一段程式碼追蹤後發現速度的瓶頸就出在硬碟 I/O 上,這時候換硬碟嗎?當然不!臨時的專案是沒那樣的預算。於是再仔細分析數據後發現,果然資料庫雖然快,但還是受限於儲存裝置檔案讀寫的速度。舉例來說:
$my_array = array(
'阿德'=>92,
'阿發'=>82,
'阿財'=>67,
'阿笨'=>100,
'阿黑'=>53);
foreach ($my_array as $v){
$sql = "insert into AAA(name, value) values($v[0], $v[1] )"; //這是示意,千萬不要照抄,會出安全漏洞的!
mysql_query($sql);
}
這樣的寫法,就會讓硬碟開啟、寫入、關閉、開啟、寫入、關閉,如此重複5次。
換個方式來寫:
foreach ($my_array as $v){
$sql_array = " ($v[0], $v[1]) ";
}
mysql_query(" insert into AAA (name,value) values " . implode(',' , $sql_array) );
這樣就可以先在記憶體中把要輸入的資料轉成一整句 sql 語法,而硬碟只需做一次開啟、寫入、關閉就可以完成,如此就可以省下大量的時間、也能延長硬碟的壽命。
在一次幫朋友寫一個臨時性的專案中發現一個問題:當資料筆數很大時,資料庫輸入的速度會變得很慢。
從這當中查到的問題是硬碟不斷的在讀寫,於是寫了一段程式碼追蹤後發現速度的瓶頸就出在硬碟 I/O 上,這時候換硬碟嗎?當然不!臨時的專案是沒那樣的預算。於是再仔細分析數據後發現,果然資料庫雖然快,但還是受限於儲存裝置檔案讀寫的速度。舉例來說:
$my_array = array(
'阿德'=>92,
'阿發'=>82,
'阿財'=>67,
'阿笨'=>100,
'阿黑'=>53);
foreach ($my_array as $v){
$sql = "insert into AAA(name, value) values($v[0], $v[1] )"; //這是示意,千萬不要照抄,會出安全漏洞的!
mysql_query($sql);
}
這樣的寫法,就會讓硬碟開啟、寫入、關閉、開啟、寫入、關閉,如此重複5次。
換個方式來寫:
foreach ($my_array as $v){
$sql_array = " ($v[0], $v[1]) ";
}
mysql_query(" insert into AAA (name,value) values " . implode(',' , $sql_array) );
這樣就可以先在記憶體中把要輸入的資料轉成一整句 sql 語法,而硬碟只需做一次開啟、寫入、關閉就可以完成,如此就可以省下大量的時間、也能延長硬碟的壽命。