基于mysql uuid针对200万行优化sql迁移的提示

时间:2015-10-02 20:04:25

标签: mysql query-optimization

我想在现有表中添加一个新列(innodb& mysql)。该列应包含UUID()。该表目前有200万行。

在我的本地i7上添加列需要24秒,而UPDATE tbl SET uuid = UUID();需要大约3:30的时间。这很重要。如果我将它封装在一个事务中,我会花一半时间,但仍然很多。

我真的不想在生产中执行如此长的查询。

我有哪些选项可以为现有的200万行添加UUID,花费更少的时间?

谢谢!

3 个答案:

答案 0 :(得分:1)

我不确定使用在不到2分钟内返回复杂随机ID的函数更新200万行的速度很慢。

如果您担心在此期间给定的表将无法使用,那么为什么不创建第二个表来添加额外的列,填充原始表中的其他字段以及填充uuid列吗?填满新表后,删除原始表并重命名新表。

答案 1 :(得分:1)

尝试在mysql.ini(mysql.cnf)中增加innodb_buffer_pool_size选项 (innodb_buffer_pool_size选项的好选择是系统(或vmbox)内存的70-80% 您也可以暂时设置这些选项:

innodb_flush_log_at_trx_commit = 0
innodb_flush_method = O_DIRECT

答案 2 :(得分:0)

虽然可能不会花费更少的时间,可能更多,但下面的解决方案可以更少地垄断表格:

在代码或MySQL事件中的某种计时器上运行以下查询,直到没有任何内容需要更新。

UPDATE tbl SET uuid = UUID() WHERE uuid IS NULL LIMIT 1000;

(显然,1000是可以调整的。)