2011-10-04 48 views
2

我有3,000多家行的阵列fomrated这样MySQL的:使用一个查询多行更新

$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

您可以尝试使用XML,请参阅[在XML中使用XML](http://www.kitebird.com/articles/mysql-xml)中的“使用XML :: Parser读取XML”一节。 html) –

回答

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 
+0

结果大致相同......它仍然需要大约9秒才能完成。 –

+1

我认为它应该会更好一点,至少你执行1个查询,而不是3k – a1ex07

+0

是的,有点,大约3%提高...我需要至少70%的提高 –

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获取更多信息