日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql_unbuffered_query的_用mysql_unbuffered_query函数取大数据

發(fā)布時(shí)間:2025/3/12 数据库 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql_unbuffered_query的_用mysql_unbuffered_query函数取大数据 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

昨天在做項(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。