PHP查询大量数据内存耗尽问题的解决方法:PHPFatalerror:Allowedmemorysizeofbytesexhausted
缓冲查询:将接收查询的结果并把他们存储在客户端的缓存中,而且接下来获取行记录的请求仅仅从本地内获取。提供一个全面的寻找加速。因为每一个单独的查询的都会快读结束,mysql快速的获取结果集并存放在内存中,而不是在处理PHP代码时保持查询为可用的
(1)优点:可以在结果集中自由地移动“当前行”的指针,这样很容易找到,因为结果是存在客户端的。
(2)缺点:需要额外的内存来存储这些结果集,而且需要大量的内存,另外,php中用来运行查询的函数会一直到所有的结果都接收才会返回值。
无缓冲查询:
会限制你通过严格的顺序访问查询结果。但他不需要额外的内存来存储整个结果集。你可以在MySQL服务器开始返回值的时候就开始获取而处理或显示数据行。当使用无缓冲结果集时,必须使用mysql_fetch_row函数获取所以的数据行,或者在给服务器发送其他任何命令前用mysql_free_result函数关闭结果集。
无缓冲查询在结果集巨大的时为你节省大量的临时内存,而且查询不需要排序时,php在MySQL数据库实际上还在处理时就可以获得第一个数据行。
缓冲查询和非缓冲查询-----缓冲查询模式适用于小数据量查询,而非缓冲查询适应于大数据量查询。
1)缓冲查询:PHP的查询缺省模式是缓冲模式,查询数据结果会一次全部提取到内存里供PHP程序处理。这样给了PHP程序额外的功能。
2)[推荐]非缓冲查询,数据库服务器会一条一条的返回数据,而不是一次全部返回
1非缓冲查询方法一:mysqli
?php
$mysqli=newmysqli(localhost,my_user,,world);
$uresult=$mysqli-query(SELECTNameFROMuser,MYSQLI_USE_RESULT);
if($uresult){
while($row=$uresult-fetch_assoc()){
echo$row[Name].PHP_EOL;
}
}
$uresult-close();
?
2. 非缓冲查询方法二:pdo_mysql
?php
$pdo=newPDO(mysql:host=localhost;dbname=world,my_user,my_pass);
$pdo-setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,false);
$uresult=$pdo-query(SELECTNameFROMCity);
if($uresult){
while($row=$uresult-fetch(PDO::FETCH_ASSOC)){
echo$row[Name].PHP_EOL;
}
}
3
非缓冲查询方法三:mysql
?php
$conn=mysql_connect(localhost,my_user,my_pass);
$db=mysql_select_db(world);
$uresult=mysql_unbuffered_query(SELECTNameFROMCity);
if($uresult){
while($row=mysql_fetch_assoc($uresult)){
echo$row[Name].PHP_EOL;
}
总结:
1)当结果集不大时,或者需要在读取所有行前获取结果集行数时,使用缓冲查询(默认).
2)当结果集很大时,使用无缓冲查询,避免PHP进程占用大量的内存.