PHP查詢MySQL大量數據的內存占用分析

2023-01-10    分類: 網站建設

PHP查詢MySQL大量數據的內存占用分析

這篇文章主要是從原理, 手冊和源碼分析在PHP中查詢MySQL返回大量結果時, 內存占用的問題, 同時對使用MySQL C API也有涉及.

昨天, 有同事在PHP討論群里提到, 他做的一個項目由于MySQL查詢返回的結果太多(達10萬條), 從而導致PHP內存不夠用. 所以, 他問, 在執(zhí)行下面的代碼遍歷返回的MySQL結果之前, 數據是否已經在內存中了? - while($row=mysql_fetch_assoc($result)){ //...

}

當然, 這種問題有許多優(yōu)化的方法. 不過, 就這個問題來講, 我首先想到, MySQL是經典的C/S(Client/Server, 客戶端/服務器)模型, 在遍歷結果集之前, 底層的實現可能已經把所有的數據通過網絡(假設使用TCP/IP)讀到了Client的緩沖區(qū), 也有另一種可能, 就是數據還在Server端的發(fā)送緩沖區(qū)里, 并沒有傳給Client.

在查看PHP和MySQL的源碼之前, 我注意到PHP手冊里有兩個功能相近的函數: mysql_query()

mysql_unbuffered_query()

兩個函數的字面意思和說明證實了我的想法, 前一個函數執(zhí)行時, 會把所有的結果集從Server端讀到Client端的緩沖區(qū)中, 而后一個則沒有, 這就是”unbuffered(未緩沖)”的意思.

那就是說, 如果用mysql_unbuffered_query()執(zhí)行了一條返回大量結果集的SQL語句, 在遍歷結果之前, PHP的內存是沒有被結果集占用的. 而用mysql_query()來執(zhí)行同樣的語句的話, 函數返回時, PHP的內存占用便會急劇增加, 立即耗光內存.

如果閱讀PHP的相關代碼, 可以看到這兩個函數的實現上的異同: /*{{{protoresourcemysql_query(stringquery[,intlink_identifier]) SendsanSQLquerytoMySQL*/ PHP_FUNCTION(mysql_query) { php_mysql_do_query(INTERNAL_FUNCTION_PARAM_PASSTHRU,MYSQL_STORE_RESULT); } /*}}}*/ /*{{{protoresourcemysql_unbuffered_query(stringquery[,intlink_identifier]) SendsanSQLquerytoMySQL,withoutfetchingandbufferingtheresultrows*/ PHP_FUNCTION(mysql_unbuffered_query) { php_mysql_do_query(INTERNAL_FUNCTION_PARAM_PASSTHRU,MYSQL_USE_RESULT); } /*}}}*/

兩個函數都調用了php_mysql_do_query(), 只差了第2個參數的不同, MYSQL_STORE_RESULT和MYSQL_USE_RESULT. 再看php_mysql_do_query()的實現: if(use_store==MYSQL_USE_RESULT){ mysql_result=mysql_use_result(&mysql->conn); }else{ mysql_result=mysql_store_result(&mysql->conn);

}

mysql_use_result()和mysql_store_result()是MySQL的C API函數, 這兩個C API函數的區(qū)別就是后者把結果集從MySQL Server端全部讀取到了Client端, 前者只是讀取了結果集的元信息.
回到PHP, 使用mysql_unbuffered_query(), 可以避免內存的立即占用. 如果在遍歷的過程不對結果進行”PHP緩存”(如放到某數組中), 則整個執(zhí)行過程雖然操作了十萬條或者百萬條或者更多的數據, 但PHP占用的內存始終是非常小的.

標簽:成都網站制作 高端網

文章標題:PHP查詢MySQL大量數據的內存占用分析
文章分享:http://m.kartarina.com/news20/229570.html

成都網站建設公司_創(chuàng)新互聯,為您提供網站策劃、外貿建站、定制開發(fā)、面包屑導航、做網站、Google

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

商城網站建設
主站蜘蛛池模板: 亚洲精品无码永久在线观看| 人妻av中文字幕无码专区| 亚洲中文字幕无码日韩| 亚洲中文久久精品无码| 无码AV波多野结衣久久| 成人无码区免费视频观看| 精品人体无码一区二区三区| 亚洲av永久无码精品三区在线4| 成人免费无码大片A毛片抽搐| 无码国产午夜福利片在线观看| 人妻无码久久精品人妻| 无码中文字幕日韩专区视频| 国产精品爽爽va在线观看无码| 久久无码人妻一区二区三区午夜| 亚洲不卡无码av中文字幕| 日韩精品无码中文字幕一区二区 | 国产免费午夜a无码v视频| 亚洲精品无码永久在线观看你懂的 | 久久久久亚洲精品无码网址色欲| 人妻系列AV无码专区| 日韩美无码五月天| 丰满亚洲大尺度无码无码专线| 日日摸日日碰夜夜爽无码| 亚洲成a人片在线观看无码 | 特级做A爰片毛片免费看无码| 午夜福利无码一区二区| 亚洲最大av资源站无码av网址 | 亚洲AV日韩AV永久无码色欲 | 精品一区二区三区无码免费直播| 国产成人精品无码免费看| 亚洲中文字幕无码爆乳av中文| 无码日本精品XXXXXXXXX| 性色av极品无码专区亚洲| 亚洲av永久中文无码精品| 亚洲Av永久无码精品黑人| 无码亚洲成a人在线观看| 精品国产性色无码AV网站| 无码国产69精品久久久久孕妇| 夫妻免费无码V看片| 亚洲av无码乱码在线观看野外| 国产成人无码午夜视频在线观看|