数码资讯
PHP查询MySQL获取大量数据时占用内存的分析
昨天,一位同事在PHP中提到了讨论组,他做了一个项目,因为MySQL查询返回的结果太多(最多为10万),导致PHP内存不足。所以,他问,在返回之前执行以下代码遍历的MySQL结果,数据已经在内存中了。 复制代码代码如下所示: 而($行= mysql_fetch_assoc($结果)){ … } 当然
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
昨天,一位同事在PHP中提到了讨论组,他做了一个项目,因为MySQL查询返回的结果太多(最多为10万),导致PHP内存不足。所以,他问,在返回之前执行以下代码遍历的MySQL结果,数据已经在内存中了。
复制代码代码如下所示:
而($行= mysql_fetch_assoc($结果)){
…
}
当然,有很多方法可以优化这个问题。然而,这一问题而言,我认为首先,MySQL是一个经典的C/S(客户机/服务器,客户端/服务器)模式,在遍历结果集,底层的实现可能已经把所有的数据通过网络(假设TCP / IP)读取缓冲区的客户,还有一种可能,那就是在服务器端发送缓冲区的数据,而不是客户端。
在查看PHP和MySQL的源代码之前,我注意到PHP手册中有两个函数:
复制代码代码如下所示:
mysql_query()
mysql_unbuffered_query()
这两个函数的字面意义和解释证实了我的想法。前者的功能执行时,它会从服务器端到客户端的缓冲区读取所有的结果集,而后者没有,这是无缓冲的意义(无缓冲)。
也就是说,如果你使用mysql_unbuffered_query()大量返回结果集的SQL语句的执行结果,通过在PHP内存不被占用。使用mysql_query结果集()执行相同的语句,函数返回时,PHP内存使用量会大大增加,立即跑出来的记忆。
如果您阅读PHP代码,可以看到这两个函数实现的异同之处。
复制代码代码如下所示:
原资源mysql_query(串/查询/ int,link_identifier })
将SQL查询发送到MySQL。
php_function(mysql_query)
{
php_mysql_do_query(internal_function_param_passthru,mysql_store_result);
}
原资源mysql_unbuffered_query(串/查询/ int,link_identifier })
将SQL查询发送到MySQL,而不获取和缓冲结果行。
php_function(mysql_unbuffered_query)
{
php_mysql_do_query(internal_function_param_passthru,mysql_use_result);
}
这两个函数调用php_mysql_do_query(),这是不同于二参数。mysql_store_result和mysql_use_result。看php_mysql_do_query实施()。
复制代码代码如下所示:
如果(use_store = = mysql_use_result){
mysql_result = mysql_use_result(MySQL -> Conn);
其他{ }
mysql_result = mysql_store_result(MySQL -> Conn);
}
mysql_use_result()和()是mysql_store_result C API函数mysql。两个C API函数的区别在于后者从MySQL服务器端到客户端读取结果集,前者只读取结果集的元信息。
Back to the PHP, the use of mysql_unbuffered_query (), can avoid memory immediately. 如果遍历过程不需要PHP(例如在高速缓存数组中),那么在执行十万个或一百万个或更多数据时,整个执行过程,但PHP内存总是非常小的。
复制代码代码如下所示:
而($行= mysql_fetch_assoc($结果)){
…
}
当然,有很多方法可以优化这个问题。然而,这一问题而言,我认为首先,MySQL是一个经典的C/S(客户机/服务器,客户端/服务器)模式,在遍历结果集,底层的实现可能已经把所有的数据通过网络(假设TCP / IP)读取缓冲区的客户,还有一种可能,那就是在服务器端发送缓冲区的数据,而不是客户端。
在查看PHP和MySQL的源代码之前,我注意到PHP手册中有两个函数:
复制代码代码如下所示:
mysql_query()
mysql_unbuffered_query()
这两个函数的字面意义和解释证实了我的想法。前者的功能执行时,它会从服务器端到客户端的缓冲区读取所有的结果集,而后者没有,这是无缓冲的意义(无缓冲)。
也就是说,如果你使用mysql_unbuffered_query()大量返回结果集的SQL语句的执行结果,通过在PHP内存不被占用。使用mysql_query结果集()执行相同的语句,函数返回时,PHP内存使用量会大大增加,立即跑出来的记忆。
如果您阅读PHP代码,可以看到这两个函数实现的异同之处。
复制代码代码如下所示:
原资源mysql_query(串/查询/ int,link_identifier })
将SQL查询发送到MySQL。
php_function(mysql_query)
{
php_mysql_do_query(internal_function_param_passthru,mysql_store_result);
}
原资源mysql_unbuffered_query(串/查询/ int,link_identifier })
将SQL查询发送到MySQL,而不获取和缓冲结果行。
php_function(mysql_unbuffered_query)
{
php_mysql_do_query(internal_function_param_passthru,mysql_use_result);
}
这两个函数调用php_mysql_do_query(),这是不同于二参数。mysql_store_result和mysql_use_result。看php_mysql_do_query实施()。
复制代码代码如下所示:
如果(use_store = = mysql_use_result){
mysql_result = mysql_use_result(MySQL -> Conn);
其他{ }
mysql_result = mysql_store_result(MySQL -> Conn);
}
mysql_use_result()和()是mysql_store_result C API函数mysql。两个C API函数的区别在于后者从MySQL服务器端到客户端读取结果集,前者只读取结果集的元信息。
Back to the PHP, the use of mysql_unbuffered_query (), can avoid memory immediately. 如果遍历过程不需要PHP(例如在高速缓存数组中),那么在执行十万个或一百万个或更多数据时,整个执行过程,但PHP内存总是非常小的。
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。