• php查询大量sql语句时内存溢出的解决方法



    今天刚发现一个之前没有见过的错误,mysql内存不足。研究了好久找出了解决办法,分享给大家。


    问题:


    使用php查询mysql大数据量的时候,程序尚未执行完毕,跳出警告:


    Fatal error:  Allowed memory size of 100663296 bytes exhausted (tried to allocate 103 bytes)


    错误提示:php所分配到的100M内存被占用完毕。


    最简单的解决办法是:在执行文件的头部增加:ini_set(‘memory_limit’,’256M’); 把内存增加到256M或者更多,可以增大php所使用的内存空间


    但是下次若要读取更多的数据该怎么办呢,总不能一次次的增加,导致服务器的内存都被php吃光。

    介绍一个函数:


    使用memory_get_usage()方法获得php使用的内存量。发现随着读取数据条数的增加,php使用的内存在一步步增加。


    难道php在查询mysql时的数据是存在内存中的?搜索了一下,发现果真大概就是这个意思。


    mysql的C API函数有mysql_use_result()和mysql_store_result()


    mysql_store_result()会把结果集从mysqlServer读到客户端,而 mysql_use_result()只是读取了结果集的元信息.


    1、php的mysql_query调用的是mysql_store_result(),自动获取并缓存结果集.


    2、而php的另一个函数mysql_unbuffered_query()则是调用的 mysql_use_result(),一方面,这在处理很大的结果集时会节省可观的内存。另一方面,可以在获取第一行后立即对结果集进行操作,而不用等到整个 SQL 语句都执行完毕。


    所以我们在读取大量数据的时候,可以使用mysql_unbuffered_query()来替代mysql_query()。经测试,的确如此。而且相当给力,导完所有数据内存一直保持在1MB以内,没有增长过.


    mysql_unbuffered_query() 向 MySQL 发送一条 SQL 查询 query,但不像 mysql_query()那样自动获取并缓存结果集。一方面,这在处理很大的结果集时会节省可观的内存。另一方面,可以在获取第一行后立即对结果集进行操作,而不用等到整个 SQL 语句都执行完毕。当使用多个数据库连接时,必须指定可选参数 link_identifier。

    mysql_unbuffered_query()的好处是有代价的:在 mysql_unbuffered_query()返回的结果集之上不能使用 mysql_num_rows() 和 mysql_data_seek()。此外在向 MySQL 发送一条新的 SQL 查询之前,必须提取掉所有未缓存的 SQL 查询所产生的结果行。

    所以一定要结合自己的业务需求适当的选取函数啊。

  • 相关阅读:
    MyBatis-plus:查询操作、分页查询
    SqlServerAgent当前未运行,因此无法将此操作通知他。错误:22022
    2022 杭电多校 第一场
    华为eNSP配置专题-VLAN和DHCP的配置
    基于vue框架的uniapp小程序开发发现了新大陆
    PMP 11.27 考试倒计时6天!
    android翻转效果时钟
    孔乙己第一问之服务通信知多少?
    CesiumJS【Basic】- #024A mp4/mov 转 webm
    MySQL调优篇:单机数据库如何在高并发场景下健步如飞?
  • 原文地址:https://blog.csdn.net/eeeeety6208/article/details/127566096