mysql_unbuffered_query的_用mysql_unbuffered_query函数取大数据
昨天在做項(xiàng)目的時(shí)候,因?yàn)樯婕暗綌?shù)據(jù)表結(jié)構(gòu)的改動(dòng),需要進(jìn)行大量數(shù)據(jù)的導(dǎo)入,那么如何高效的進(jìn)行是我比較關(guān)注的。本文暫且從使用PHP腳本層面上來說,因?yàn)槭褂闷渌Z言或其他方式也可以進(jìn)行數(shù)據(jù)的重導(dǎo)。 在討論這個(gè)問題的時(shí)候,前輩給我的意見就是單獨(dú)做一個(gè)腳本,如果能拿python做更好,當(dāng)然,python我還不是很會(huì),所以拿php也能完成。既然這樣,就采用最原生的方式來進(jìn)行數(shù)據(jù)的重導(dǎo)。 整個(gè)過程中要先從一張表中取出全部數(shù)據(jù),再進(jìn)行數(shù)據(jù)的處理后導(dǎo)入到新的數(shù)據(jù)表中。而就我測(cè)試的那個(gè)數(shù)據(jù)庫中的那張表里,數(shù)據(jù)量就已經(jīng)上萬了,如果直接全部取出必定會(huì)有性能上的問題。 他人給我的建議是,使用mysql_connect后用mysql_query執(zhí)行sql(取大數(shù)據(jù)的情況如sele ct * from tbl)語句,理由是mysql_query不是返回的數(shù)據(jù)結(jié)果,因?yàn)楹竺嬗玫絤ysql_fetch_assoc之類的函數(shù),進(jìn)行游標(biāo)的移動(dòng)來取得數(shù)據(jù)。并在sql執(zhí)行前后分別使用了memory_get_usage來查看內(nèi)存使用量。當(dāng)然,執(zhí)行后內(nèi)存使用量比執(zhí)行前大了,雖然使用了不多的內(nèi)存,但對(duì)于只是測(cè)試數(shù)據(jù)庫里的數(shù)據(jù)而言還行,當(dāng)數(shù)據(jù)處理量很大的時(shí)候,php程序腳本可能會(huì)崩潰。為了確保重導(dǎo)真正線上數(shù)據(jù)庫的數(shù)據(jù)萬無一失,我還是查了一些相關(guān)資料。 最后了解到PHP中有個(gè)mysql_unbuffered_query這個(gè)函數(shù),與mysql_query有點(diǎn)類似,手冊(cè)上寫了該函數(shù)不緩存的查詢結(jié)果,它所帶來的好處就是一不用緩存結(jié)果,二就是不必等待全部查詢后進(jìn)行操作,而是直接獲取一條數(shù)據(jù)就可以操作。而mysql_query是查詢出所有符合條件的結(jié)果并緩存后才能進(jìn)行操作,這就讓我懷疑之前建議的那個(gè)方法。 于是我同樣用mysql_unbuffered_query查詢同樣一條sql語句,也同樣對(duì)執(zhí)行前后查看了內(nèi)存使用量,結(jié)果前后內(nèi)存使用量沒有變,這就說明了內(nèi)存并沒有被拿來做查詢數(shù)據(jù)緩存的相關(guān)事情。當(dāng)然也可以使用以下方法來測(cè)試:
$link = mysql_con nect(‘localhost’,’root’,’root’);
mysql_select_ db(‘phpcms’);
$sql = “SEL ECT * FROM `phpcms_content`“;
//$result = mysql_unbuffered_query($sql,$link);
$result = mysql_query($sql,$link);
while ($row = mysql_fe tch_array($result, MYSQL_NUM)) {
printf (“ID: %s Name: %s”, $row[0], $row[1]);
}
mysql_data_seek($result,0);
echo “
“;
while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
printf (“ID: %s Name: %s”, $row[0], $row[1]);
}
mysql_free_result($result);
你會(huì)發(fā)現(xiàn)使用mysql_query會(huì)輸出兩次,而mysql_unbuffered_query只輸出一次,說明使用mysql_query查詢結(jié)果必定被緩存了,而使用mysql_unbuffered_query則邊進(jìn)行查詢邊給出結(jié)果。 最后再說明,使用mysql_unbuffered_query的話,不能使用mysql_num_rows()和mysql_data_seek()這也正因?yàn)樗奶匦苑绞經(jīng)Q定了這樣。還有比較重要的一點(diǎn),如果你只是單單獲取大數(shù)據(jù)量使用這個(gè)函數(shù)可以,但是,如果你在取得大數(shù)據(jù)的時(shí)候,使用while($row = mysql_fetch_assoc($result))方式進(jìn)行執(zhí)行新的sql語句的話,會(huì)出錯(cuò)。手冊(cè)上也寫明了,在執(zhí)行一條心的sql之前,要提取所有未緩存的sql查詢所產(chǎn)生的行。所以只使用mysql_unbuffered_query取數(shù)據(jù)可以,但期間還要執(zhí)行其他sql就不行了。 以上只是我對(duì)這個(gè)函數(shù)的初步認(rèn)識(shí),如果理解有誤,也希望能指正交流。
總結(jié)
以上是生活随笔為你收集整理的mysql_unbuffered_query的_用mysql_unbuffered_query函数取大数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用php,使用 PHP
- 下一篇: mysql not in报错_mysql