一次处理行

时间:2014-07-09 17:26:36

标签: php mysql

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

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

while ( true) {
   $q= query("SELECT * FROM table LIMIT $start, $limit");

   // processs rows

   $start += $limit;

   sleep(1);
}

3 个答案:

答案 0 :(得分:3)

您需要使用cursors

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

答案 1 :(得分:1)

使用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
}

答案 2 :(得分:0)

$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
}