BeWithYou

胡搞的技术博客

  1. 首页
  2. PHP
  3. PDO查询结果直接遍历更省内存

PDO查询结果直接遍历更省内存


最近导数据的时候发现一个问题,内存有时占用过多导致PHP进程挂掉。

看了下项目封装的PDO,用不同的接口会有不同的内存占用情况。其中一种直接对于PDOStatement对象进行遍历,还有一种是fetchAll()了以后进行遍历。结果当然是后者占用太多内存。

$conn = new PDO('mysql:host=localhost;dbname=mydb', 'username', 'password');

$st = $conn->prepare("SELECT * FROM tb_videos");
$m1 = memory_get_usage();
$st->execute();
$m2 = memory_get_usage();
$result = $st->fetchAll( PDO::FETCH_ASSOC );
$m3 = memory_get_usage();

echo ($m2-$m1)/1024/1024 . "\n";
echo ($m3-$m2)/1024/1024;

上面的结果是fetchAll()后保存的结果占用的内存是原来的4倍。其实我们去看下PDO的php定义,PDOStatement类是实现了Traversable接口,在Cpp代码里实现了迭代器的几个方法。所以我们是可以在execute()以后对于其进行foreach遍历的。

另外,如果数据量不超过10W条的话,是可以全表一次性load出来处理的,不用分页分批读取。分页的话效率会低,要考虑order问题,还有中途新数据进来的风险。

回到顶部