目前我在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) . ')');
答案 0 :(得分:6)
如果您只想将所有记录更新为processed = 1
为什么不通过单个查询解决?:
UPDATE `stats_visits` SET `processed` = 1 WHERE `processed` = 0;
答案 1 :(得分:2)
在第一个版本中,每次更新都会为数据库命中一次。这通常是一个坏主意。第二个版本正在访问数据库一次。
如果您担心将来如何解决这个问题,可能会创建一个混合体。将更新批处理为100个组,并以块为单位进行更新。
答案 2 :(得分:1)
最简单的方法是将所有需要更新的ID存储为数组,然后使用IN
运算符将这些内容隐藏到查询中。
e.g。
$processedArray= array();
while($row = mysql_fetch_assoc($sqlquery)){
$stat_id = $row['id'];
//Your processing goes here
$processedArray[] = $stat_id; //Store an id if it needs updating as processed
}
mysql_query('UPDATE stats_visits SET processed = 1 WHERE id IN ('.implode(',', $processedArray).')');