mysql数据库内存和cpu飙升原因_mysql占高内存与cpu原因分析

很多朋友都可能碰到几万数据查询mysql就会占很高的内存和cup特别是在windows系统下,下面我们来看看原因分析吧。

有同事在PHP讨论群里提到, 他做的一个项目由于MySQL查询返回的结果太多(达10万条), 从而导致PHP内存不够用. 所以, 他问, 在执行下面的代码遍历返回的MySQL结果之前, 数据是否已经在内存中了? -

代码如下

复制代码

while ($row = _fetch_assoc($result)) { // ... }

当然, 这种问题有许多优化的方法. 不过, 就这个问题来讲, 我首先想到, MySQL是经典的C/S(Client/Server, 客户端/服务器)模型, 在遍历结果集之前, 底层的实现可能已经把所有的数据通过网络(假设使用TCP/IP)读到了Client的缓冲区, 也有另一种可能, 就是数据还在Server端的发送缓冲区里, 并没有传给Client.

在查看PHP和MySQL的之前, 我注意到PHP手册里有两个功能相近的函数:

代码如下

复制代码

mysql_query() mysql_unbuffered_query()

两个函数的字面意思和说明证实了我的想法, 前一个函数执行时, 会把所有的结果集从Server端读到Client端的缓冲区中, 而后一个则没有, 这就是”unbuffered(未缓冲)”的意思.

那就是说, 如果用mysql_unbuffered_query()执行了一条返回大量结果集的SQL语句, 在遍历结果之前, PHP的内存是没有被结果集占用的. 而用mysql_query()来执行同样的语句的话, 函数返回时, PHP的内存占用便会急剧增加, 立即耗光内存.

如果阅读PHP的相关代码, 可以看到这两个函数的实现上的异同:

代码如下

复制代码

/* {{{ proto resource mysql_query(string query [, int link_identifier]) Sends an SQL query to MySQL */ PHP_FUNCTION(mysql_query) {

_mysql_do_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_STORE_RESULT); }

/* }}} */

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

f68f2add0b68e4f9810432fce46917b7.png

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要测试MySQL数据库占用服务器内存CPU的情况,可以采取以下步骤: 1. 安装和配置MySQL:首先,需要在服务器上安装和配置MySQL数据库。确保MySQL已正确地设置,并进行必要的优化,以确保其正常运行。 2. 创建测试数据库:在MySQL中创建一个用于测试的数据库,并生成足够的数据以模拟实际的数据库使用情况。 3. 执行负载测试:使用性能测试工具,如SysBench或TPC-C,模拟多个并发用户同时对数据库进行读取、写入和更新操作。通过逐步增加负载,测试服务器在各种负载下的表现。 4. 监测内存使用情况:使用系统监测工具,如top、htop或vmstat,在测试期间实时监测服务器的内存使用情况。特别关注MySQL内存使用情况,包括缓冲池、查询缓存和连接池等。 5. 监测CPU使用情况:使用类似的监控工具,在测试期间实时监测服务器的CPU使用情况。检查MySQL进程在运行期间的CPU利用率。 6. 分析测试结果:根据监测工具提供的数据,分析服务器在不同负载下的内存CPU使用情况。观察是否存在内存泄漏、频繁的磁盘读写等问题。 7. 优化数据库配置和查询:根据测试结果,对MySQL的配置文件进行调整,优化内存CPU的使用。同时,对查询进行优化,改善数据库性能。 通过以上步骤,可以测试MySQL数据库对服务器内存CPU占用情况,并发现潜在的性能问题。根据测试结果,可以进行必要的优化和调整,提升数据库的性能和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值