《PHP查询MySQL大量数据的时候内存占用分析》由会员分享,可在线阅读,更多相关《PHP查询MySQL大量数据的时候内存占用分析(4页珍藏版)》请在人人文库网上搜索。
1、PHP查询MySQL大量数据的时候内存占用分析文章主要是从原理,手册和源码分析在PH冲查询MySQ返回大 量结果时,内存占用的问题,同时对使用MySQLCAP也有涉及.跟随去 看看吧!昨天,有同事在PHF讨论群里提到,他做的一个项目由于 MySQL 查询返回的结果太多(达10万条),从而导致PHP内存不够用.所以, 他问,在执行下面的代码遍历返回的 MySQL吉果之前,数据是否已经 在内存中了 ?-复制代码代码如下 :while($row=mysql_fetch_assoc($result)/.当然, 这种问题有许多优化的方法 . 不过, 就这个问题来讲 , 我首 先想到,MySQL是经典的C。
2、/S(Client/Server,客户端/服务器)模型,在遍历结果集之前 ,底层的实现可能已经把所有的数据通过网络 (假 设使用TCP/IP)读到了 Client的缓冲区,也有另一种可能,就是数据 还在 Server 端的发送缓冲区里 , 并没有传给 Client.在查看PHF和MySQ的源码之前,我注意到PHP手册里有两个功 能相近的函数 :复制代码代码如下 :mysql_query()mysql_unbuffered_query()两个函数的字面意思和说明证实了我的想法 , 前一个函数执行 时 , 会把所有的结果集从 Server 端读到 Client 端的缓冲区中 , 而后一 个则没有 。
3、,这就是” unbuffered( 未缓冲) ”的意思 .那就是说 , 如果用 mysql_unbuffered_query() 执行了一条返回大量结果集的SQL语句,在遍历结果之前,PHP的内存是没有被结果集 占用的 . 而用 mysql_query() 来执行同样的语句的话 , 函数返回时 ,PHP 的内存占用便会急剧增加 , 立即耗光内存 .如果阅读PHP的相关代码,可以看到这两个函数的实现上的异同:复制代码代码如下 :/*protoresourcemysql_query(stringquery,intlink_identifier)SendsanSQLquerytoMySQL*/PHP。
4、_FUNCTION(mysql_query)php_mysql_do_query(INTERNAL_FUNCTION_PARAM_PASSTHRU,MYSQL_S TORE_RESULT);/*/*protoresourcemysql_unbuffered_query(stringquery,intli nk_identifier)SendsanSQLquerytoMySQL,withoutfetchingandbufferingtheresult rows*/PHP_FUNCTION(mysql_unbuffered_query)php_mysql_do_query(INTERNAL_FUN。
5、CTION_PARAM_PASSTHRU,MYSQL_USE_RESULT);/*/两个函数都调用了 php_mysql_do_query(), 只差了第 2 个参数的不同,MY SQL_STORE_RES 和LM YSQL_USE_RESU再看 php_mysql_do_query()的实现:复制代码代码如下:if(use_store=MYSQL_USE_RESULT) mysql_result=mysql_use_result(&mysql-conn);elsemysql_result=mysql_store_result(&mysql-conn);mysql_use_result() 和 mysql_store_result() 是 MySQ的 CAPI函数,这两个CAPI函数的区别就是后者把结果集从 MySQLServe端全部读取到了 Client 端, 前者只是读取了结果集的元信息 .回到PHP使用mysql_unbuffered_query(), 可以避免内存的立 即占用.如果在遍历的过程不对结果进行” PHP缓存”(如放到某数组 中), 则整个执行过程虽然操作了十万条或者百万条或者更多的数据 , 但PHP占用的内存始终是非常小的。