mysql占高内存与cpu问题分析
发布时间:2022-06-15 13:47:48 所属栏目:MySql教程 来源:互联网
导读:很多朋友都可能碰到几万数据查询mysql就会占很高的内存和cup特别是在windows系统下,下面我们来看看原因分析吧. 有同事在PHP讨论群里提到,他做的一个项目由于MySQL查询返回的结果太多(达10万条), 从而导致PHP内存不够用.所以,他问,在执行下面的代码遍历返回的
很多朋友都可能碰到几万数据查询mysql就会占很高的内存和cup特别是在windows系统下,下面我们来看看原因分析吧. 有同事在PHP讨论群里提到,他做的一个项目由于MySQL查询返回的结果太多(达10万条), 从而导致PHP内存不够用.所以,他问,在执行下面的代码遍历返回的MySQL结果之前, 数据是否已经在内存中了? 代码如下: 在查看PHP和MySQL的源码之前,我注意到PHP手册里有两个功能相近的函数,代码如下: mysql_query() mysql_unbuffered_query() 如果阅读PHP的相关代码,可以看到这两个函数的实现上的异同,代码如下: /* {{{ proto resource mysql_query(string query [, int link_identifier]) Sends an SQL query to MySQL */ PHP_FUNCTION(mysql_query) { php_mysql_do_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_STORE_RESULT); } --phpfensi.com /* }}} */ /* {{{ proto resource mysql_unbuffered_query(string query [, int link_identifier]) Sends an SQL query to MySQL, without fetching and buffering the result rows */ 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函数的区别就是后者把结果集从MySQL Server端全部读取到了Client端,前者只是读取了结果集的元信息. 回到PHP,使用mysql_unbuffered_query(),可以避免内存的立即占用,如果在遍历的过程不对结果进行”PHP缓存”(如放到某数组中),则整 ![]() (编辑:开发网_开封站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |