当前位置:Gxlcms > PHP教程 > pdo的query方法查询为什么这么耗内存

pdo的query方法查询为什么这么耗内存

时间:2021-07-01 10:21:17 帮助过:23人阅读

$rs = $pdo->query('select * from tb_user');
echo convert(memory_get_usage());die;

tb_user表2G的话,内存开销也要2G多,难道query返回的不是一个游标吗?

回复内容:

$rs = $pdo->query('select * from tb_user');
echo convert(memory_get_usage());die;

tb_user表2G的话,内存开销也要2G多,难道query返回的不是一个游标吗?

http://stackoverflow.com/questions/6895098/pdo-mysql-memory-consumption-with-large-result-set
建议读一下这篇文章
似乎pdo没你想那么聪明
我感觉最后那个回答 手动分页返回更靠谱一些

PHP+MySQL缓冲查询和无缓冲查询
http://php.com/manual/zh/mysqlinfo.concepts.buffering.php
http://php.com/manual/zh/mysqli.query.php
PHP MySQL查询(mysqli,pdo_mysql)默认使用缓冲模式.
也就是说查询结果将一次性从MySQL传输到PHP进程内存中,
这时可以统计结果集的行数,以及移动结果集指针.
缓冲模式下,如果结果集很大,那么PHP进程也会占用大量的内存,
直到结果集被unset或者free.
store_result也用于缓冲模式,所有结果一次性存储到PHP进程中:
mysqli::store_result
mysqli_stmt::store_result
如果PHP的MySQL数据库驱动底层用的是libmysqlclient,那么memory_limit不能统计到结果集占用的内存,
除非结果集已经赋值给PHP变量,如果底层使用mysqlnd作为驱动时则可以统计到(PHP从5.4开始默认底层默认使用mysqlnd).
无缓冲模式下执行的查询将会返回一个resource资源引用,位于MySQL查询结果等待PHP获取.
无缓冲模式下,PHP进程占用的内存很少,但会增大MySQL服务器的负载.
在PHP取回所有结果前,在当前数据库连接下不能发送其他的查询请求.
无缓冲查询简称use_result.
总结:
当结果集不大时,或者需要在读取所有行前获取结果集行数时,使用缓冲查询(默认).
当结果集很大时,使用无缓冲查询,避免PHP进程占用大量的内存.

$rs = $mysqli->query("SELECT * FROM City", MYSQLI_USE_RESULT);
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);

人气教程排行