【发布时间】:2012-04-13 14:16:59
【问题描述】:
目前我有一个在 PHP 中运行的 MySQL 查询,在查看结果时我会更新原始表,但一个包含 500 行的简单表需要 30 秒才能完成:
$sqlquery = mysql_query('SELECT id, special_data FROM stats_visits WHERE processed = 0');
while($row = mysql_fetch_assoc($sqlquery)){
$stat_id = $row['id'];
// Make use of special_data field for some operations
mysql_query('UPDATE stats_visits SET processed = 1 WHERE id = ' . $stat_id);
}
是因为我正在更新我从中选择的表吗?我已经通过执行以下操作解决了这个问题,但是由于该表将来可能有数千条记录,我不确定 IN 的支持情况如何:
$statids = array();
$sqlquery = mysql_query('SELECT id, special_data FROM stats_visits WHERE processed = 0');
while($row = mysql_fetch_assoc($sqlquery)){
$statids[] = $row['id'];
// Make use of special_data field for some operations
}
mysql_query('UPDATE stats_visits SET processed = 1 WHERE id IN(' . implode(',', $statids) . ')');
【问题讨论】:
-
为什么要获取所有行并按 id 更新,而不是仅根据您在 SELECT 中使用的条件进行更新?
-
在该选择中(我可能应该指出这一点)我选择更多数据,将其用于处理,一旦使用,我需要通过设置 processes=1 来表明这一点,因此在下一次运行中我可以跳过它.
-
如果您所做的只是更新
processed列,那么没有理由运行SELECT和UPDATE查询。您可以使用下面提供的答案@Truth 来做到这一点。另一种选择是使用一组已编辑的数据并将所有内容组合成两个查询。 -
您还可以研究使用临时表和交叉表更新 -> ricochen.wordpress.com/2011/06/21/…
-
我不是简单地更新列,我已经编辑了我的问题,表明我选择了更多数据,使用它,然后一旦完成,我将该记录设置为“已处理”。
标签: php mysql query-optimization