溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

php導(dǎo)入大量數(shù)據(jù)到mysql性能優(yōu)化的方法

發(fā)布時(shí)間:2021-06-29 10:56:11 來源:億速云 閱讀:258 作者:chen 欄目:開發(fā)技術(shù)

這篇文章主要介紹“php導(dǎo)入大量數(shù)據(jù)到mysql性能優(yōu)化的方法”,在日常操作中,相信很多人在php導(dǎo)入大量數(shù)據(jù)到mysql性能優(yōu)化的方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”php導(dǎo)入大量數(shù)據(jù)到mysql性能優(yōu)化的方法”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

本文實(shí)例講述了php導(dǎo)入大量數(shù)據(jù)到mysql性能優(yōu)化技巧。分享給大家供大家參考。具體分析如下:

在mysql中我們結(jié)合php把一些文件導(dǎo)入到mysql中,這里就來分享一下我對15000條記錄進(jìn)行導(dǎo)入時(shí)分析與優(yōu)化,需要的朋友可以參考一下.

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

我理了一下思路,數(shù)據(jù)庫結(jié)構(gòu)很簡單,可以認(rèn)為就兩個(gè)字段,一個(gè)字段存電話號碼,另一字段存類別,類別分別為c,d,e等等,分別代表已經(jīng)撥通過此電話,未撥通過此電話,未撥打過此電話等等狀態(tài),而整個(gè)程序邏輯是這樣的.

■拿到一個(gè)txt文件,里面存的是電話號碼

■通過程序?qū)xt文件導(dǎo)入到mysql里

■導(dǎo)入的時(shí)候,檢測txt里的電話號碼是否和mysql里的重復(fù),如果不重復(fù),直接插入新記錄,如果重復(fù),就需要按照判斷電話號碼所屬類別來進(jìn)行更新。

由于每個(gè)txt里的電話號碼導(dǎo)入時(shí),都需要做一次比較,所以程序肯定會耗時(shí)一些,這里我們先撇開這個(gè)原因,因?yàn)楸疚恼碌臉?biāo)題是優(yōu)化寫入速度,那么程序什么時(shí)候會寫入記錄呢?通過上面的邏輯得知,在匹配數(shù)據(jù)庫時(shí),沒有發(fā)現(xiàn)存在記錄時(shí)會發(fā)生寫入數(shù)據(jù)庫操作(當(dāng)然update也算,只是這里只討論insert),那么將上述邏輯轉(zhuǎn)化為代碼,差不多如下:

復(fù)制代碼 代碼如下:

//$array為txt文件explode出來的數(shù)組,每一個(gè)為一個(gè)電話號碼, $str為類型
for($i=0; $i<count($array); $i++) 

        $tmpstr = "'". $array[$i] ."','". $str ."'";
        $sql="INSERT INTO ".$usertable." (tel,type) VALUES (".$tmpstr.")";
        mysql_query($sql);
}


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

復(fù)制代碼 代碼如下:

$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);


這樣,整個(gè)寫入操作只有1次,大大地縮短了執(zhí)行時(shí)間,差不多10秒就搞定了15000條記錄,好了,本文到此結(jié)束,如果你也遇上寫入大量數(shù)據(jù)到mysql耗時(shí)長的問題時(shí),不如試試本文的優(yōu)化方式.

到此,關(guān)于“php導(dǎo)入大量數(shù)據(jù)到mysql性能優(yōu)化的方法”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI