程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php導入大量數據到mysql性能優化

php導入大量數據到mysql性能優化

編輯:關於PHP編程

在mysql中我們結合php把一些文件導入到mysql中,下面我來分享我對15000條記錄進行導入時分析與優化,各位朋友可參考。


之前有幾篇文章,說了最近tiandi在幫朋友做一個小項目,用於統計電話號碼的,每次按需求從數據庫裡隨機生成打包的電話號碼,然後不停地讓人打這些電話號碼推銷產品(小小鄙視一下這樣的行為)。但是朋友要求幫忙,咱也不能不幫啊,是吧。程序兩個星期前已經做好,測試完畢交工。前幾天朋友來電說,每天導入電話號碼的時間越來越長,有時候一萬條記錄就要半個小時以上,看看能不能想辦法提高一下這個速度。

我理了一下思路,數據庫結構很簡單,可以認為就兩個字段,一個字段存電話號碼,另一字段存類別,類別分別為c,d,e等等,分別代表已經撥通過此電話,未撥通過此電話,未撥打過此電話等等狀態,而整個程序邏輯是這樣的:

■拿到一個txt文件,裡面存的是電話號碼
■通過程序將txt文件導入到mysql裡
■導入的時候,檢測txt裡的電話號碼是否和mysql裡的重復,如果不重復,直接插入新記錄,如果重復,就需要按照判斷電話號碼所屬類別來進行更新。
由於每個txt裡的電話號碼導入時,都需要做一次比較,所以程序肯定會耗時一些,這裡我們先撇開這個原因,因為本文章的標題是優化寫入速度,那麼程序什麼時候會寫入記錄呢?通過上面的邏輯得知,在匹配數據庫時,沒有發現存在記錄時會發生寫入數據庫操作(當然update也算,只是這裡只討論insert)。那麼將上述邏輯轉化為代碼,差不多如下:

 代碼如下 復制代碼

//$array為txt文件explode出來的數組,每一個為一個電話號碼, $str為類型
for($i=0; $i<count($array); $i++)
    {
        $tmpstr = "'". $array[$i] ."','". $str ."'";
        $sql="INSERT INTO ".$usertable." (tel,type) VALUES (".$tmpstr.")";
        mysql_query($sql);
    }

以上代碼完全正確,但是效率低下,當txt文件裡包含了上萬個電話號碼時,即會有上萬次的插入數據庫操作,雖然每次的數據庫寫入操作都是很快的,但是上萬條累計下來,這個執行時間不容忽視。tiandi簡單的測試了一下插入15000萬條記錄,耗時差不多5分鐘。如果再加上之前的邏輯判斷等等過程,那麼半個小時還真得不算少了。這樣可不行,必須減少數據庫庫寫入次數才對,於是上面代碼變更為以下:

 代碼如下 復制代碼

$sql2="INSERT INTO ".$usertable." (tel,type,updatetime) VALUES";
for($i=0; $i<count($array); $i++)
    {
        $tmpstr = "'". $array[$i] ."','". $str ."'";
 $sql2 .= "(".$tmpstr."),";
    }
$sql2 = substr($sql2,0,-1);   //去除最後的逗號
mysql_query($sql2);

這樣,整個寫入操作只有1次,大大地縮短了執行時間,差不多10秒就搞定了15000條記錄。好了,本文到此結束,如果你也遇上寫入大量數據到mysql耗時長的問題時,不如試試本文的優化方式。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved