一次处理行


process rows at a time

假设我有一个超过100万行的mysql表。我想选择表中的所有行,并单独处理每个条目。防止内存耗尽的最好方法是什么?

也许使用限制一次选择几行?

while ( true) {
   $q= query("SELECT * FROM table LIMIT $start, $limit");
   // processs rows
   $start += $limit;
   sleep(1);
}

你需要使用光标

网站上有非常好的mysql文档-例如,这可能是一个很好的起点

使用limitoffset,它们将返回结果的一部分,仅限于limit并由offset抵消。在使用这些工具时,请记住对行进行排序,这样就不会两次得到相同的行。我的建议是按主键或日期创建行升序排序-在您的情况(while(true))循环中,您非常确定即使在程序开始后添加的记录也会被处理。

下面的例子使用PDO查询数据库。

$package = 1000;
$i = 0;
try{
    while(true){
        $currOffset == i++ * $package;
        $q = $db->query(
                        "select 
                             * 
                         from 
                             foo 
                         order by 
                             bar ASC
                         offset :offset 
                         limit :limit"
                        );
        $q->bindParam(':offset', $currOffset, PDO::PARAM_INT);
        $q->bindParam(':limit', $package, PDO::PARAM_INT);
        $q->execute();
        $res = $q->fetchAll(PDO::FETCH_ASSOC);
        if(!$res || !count($res)){
            break;
        }
        //process your chunk
    }
} catch(PDOException $ex){
   //handle exception, abort transaction etc
}
$total = query("SELECT count(*) as total FROM table");
for($i=0;$i<=$total['total'];$i+=100) {
   $q= query("SELECT * FROM table ORDER BY id ASC LIMIT $i, 100");
   // process rows
   // no purpose in sleeping
}