我们说我有一个超过100万行的mysql表。我想选择表中的所有行并单独处理每个条目。什么是防止内存耗尽的最佳方法?
也许使用限制一次选择几行?
while ( true) {
$q= query("SELECT * FROM table LIMIT $start, $limit");
// processs rows
$start += $limit;
sleep(1);
}
答案 0 :(得分:3)
您需要使用cursors。
在mysql的网站上有非常好的文档 - 例如,这可能是一个很好的起点
答案 1 :(得分:1)
使用limit
和offset
,它只会返回部分结果,仅限于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
}