我有一个像这样有3000多行的阵列
$COUNTS = array(
1=>5,
2=>22,
3=>120,
4=>0,
....
);
其中键表示ID,值是计算的COUNT ...
我需要使用这些新值(使用php)更新表中的所有行...
所以现在我一个接一个地更新它们 (简化)喜欢
foreach($COUNTS as $id=>$count){
mysql_query("UPDATE categories SET count=$count WHERE id=$id");
}
我需要制作3,000多个查询,才能进行简单的更新....
这可以通过一个查询或任何其他资源消耗较少的方式完成吗?可能生成一个csv文件并在运行中进行更新或其他什么?
答案 0 :(得分:1)
您可以尝试类似
的内容UPDATE categories c
INNER JOIN
(
SELECT 1 as id, 23 as `cnt`
UNION
SELECT 2 as id, 25 as `cnt`
-- UNION etc
)a
ON c.id = a.id
SET c.`count` = a.cnt
答案 1 :(得分:1)
看起来你可能已经想到了这一点,但无论如何都有一些建议。如果您正在进行大量更新(特别是一次或很少),请确保禁用任何触发器(如果不需要)以及索引。但是,在您的情况下,索引似乎不是问题。
您当然可以将查询保留在循环中。 3000条记录的9s似乎很高,但取决于其他情况,这可能没问题。
您还可以将数据写入文件,然后通过
将文件批量插入新表中LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;
请参阅http://dev.mysql.com/doc/refman/5.5/en/load-data.html以供参考。然后,您必须加入这两个表以进行更新。在这种情况下你必须处理文件IO和另一个数据库连接,所以不确定你会节省多少钱。
另一种选择是创建一个预准备语句并将参数绑定到它。那也应该更快一点。查看http://us2.php.net/manual/en/mysqli.prepare.php了解详情