mysql更新/设置语句的速度。乘以一列

时间:2009-05-11 22:27:25

标签: mysql performance

我在MySql表“temp”中有100万行,并且希望将列“t”(int unsigned,indexed)乘以1000。

mysql> update temp set t=1000*t;

此过程需要25秒。关于非索引列的相同语句需要10秒;

如何更快地完成此过程?我必须在超过1e5的桌子上应用它。

2 个答案:

答案 0 :(得分:2)

您可以在更新完成后关闭索引并重新打开

ALTER TABLE tbl_name DISABLE KEYS;
ALTER TABLE tbl_name ENABLE KEYS;

或者如果您使用的是myISAM 您可以使用delay_key_write标志。您可以为每个表设置它,或 全球。您可以使用“FLUSH TABLE mytable”命令强制mysql 更新索引的磁盘副本。

http://dev.mysql.com/doc/mysql/en/create-table.html

http://dev.mysql.com/doc/mysql/en/myisam-start.html

http://dev.mysql.com/doc/mysql/en/flush.html

答案 1 :(得分:1)

索引与此处的问题无关。想想你正在做什么 - 你正在改变你表中的所有行,所以无论你如何选择它们,如果你有一个t或不是索引,你仍然在扫描整个表。

UPDATE操作== IO是你的瓶颈。获得更快的磁盘。

如果你正在使用InnoDB,我唯一的建议是看看调整innodb_flush_log_at_trx_commit并将其设置为2有助于你的表现,但我怀疑它只是一个查询。在UPDATE之后禁用密钥并重新启用它们将无法在InnoDB中使用。