更新数据库中的多行或多条记录

4
如果我有这样的脚本:
$sql = "SELECT * FROM table WHERE Status='0'";
$query = mysql_query($sql);

    while ($row = mysql_fetch_array($query)) 
       $id = $row['ID'];

           //.........

       if($process->send()) { //after sent
         mysql_query("UPDATE table 
                      SET Status ='1' 
                      WHERE ID = '$id'"); 
       }
    }

当处理完成后,它将更新每一行。但如果我有超过一万条记录的Status='0',那么更新将变得缓慢。

所以,有没有更好的方式来更新记录?我不能使用一个单一的查询来更新所有记录,因为我需要知道每个处理是否完成。

谢谢。


1
在一个拥有良好索引的百万行表中更新一行应该是瞬间完成的。你每秒钟向服务器发送了多少次更新请求? - Lieven Keersmaekers
将整个任务推入另一个线程中并进行并行处理。将其推入另一个线程中,但仅使用状态为0的下一个作业,并使用您的表作为队列。 - Tony Hopkinson
@TomvanderWoerdt - 你太过于字面理解"瞬间"了,但MySQL应该能够处理每秒1000次更新(虽然这不是一个好主意)。这些人获得了每秒120,000次的性能(集群化)。 - Lieven Keersmaekers
@TomvanderWoerdt - 我认为根据OP自己的话,这不能通过一个查询完成,但你的答案是一个很好的替代方案(已经点赞)。 - Lieven Keersmaekers
1
@Lieven 谢谢你的回复。我会检查我的数据库,看看是否有任何问题。 - Irene Ling
显示剩余2条评论
4个回答

10

将所有成功的元素添加到一个数组中,然后一次性提交它们。

if ($process->send()) {
    $done[] = $id;
}

稍后一点:

mysql_query('UPDATE table SET Status=1 WHERE ID IN ('.implode(',', $done).')');

+1 这绝对是一个性能提升,但如果 OP 的服务器无法处理每秒数千次的更新(或更新包含几千条记录的表,这取决于你如何解释问题),那么他还有其他问题。 - Lieven Keersmaekers
需要注意的是,如果有太多的项目,IN操作可能会表现不佳。我认为原帖作者应该尝试两种解决方案并进行比较。 - RageZ

2

2

1

你需要为那段代码编写存储过程。这样可以提高执行速度。


一个存储过程对于如此简单的更新操作不会有显著的提速。 - Lieven Keersmaekers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接