加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_开封站长网 (http://www.0378zz.com/)- 科技、AI行业应用、媒体智能、低代码、办公协同!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

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缓存”(如放到某数组中),则整

(编辑:开发网_开封站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读