我想在现有表中添加一个新列(innodb& mysql)。该列应包含UUID()
。该表目前有200万行。
在我的本地i7上添加列需要24秒,而UPDATE tbl SET uuid = UUID();
需要大约3:30的时间。这很重要。如果我将它封装在一个事务中,我会花一半时间,但仍然很多。
我真的不想在生产中执行如此长的查询。
我有哪些选项可以为现有的200万行添加UUID,花费更少的时间?
谢谢!
答案 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是可以调整的。)