1

目前我有一个在 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) . ')');
4

3 回答 3

6

如果您只想将所有记录更新为processed = 1为什么不使用单个查询来解决它?:

UPDATE `stats_visits` SET `processed` = 1 WHERE `processed` = 0;
于 2012-04-13T14:19:41.473 回答
2

在第一个版本中,每次更新都会访问一次数据库。这通常是个坏主意。第二个版本是访问数据库一次。

如果您担心这将如何在未来发挥作用,也许可以创建一个混合体。将更新分成 100 个组,并以块的形式更新它们。

于 2012-04-13T14:20:21.880 回答
1

最简单的方法是将所有需要更新的 id 存储为一个数组,然后使用IN运算符将​​它们内爆到查询中。

例如

$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).')');
于 2012-04-13T14:39:16.120 回答