使用随机数有效地更新mySQL中的450k行

时间:2016-06-10 10:19:56

标签: mysql

我的表中有 450k行(并且正在上升)。我需要使用随机数更新RandSort列。我通常在其他网站上使用它:

UPDATE Links SET Timestmp = Timestmp, `RandSort` = if ((@a := floor(8+rand()*113)) BETWEEN 103 AND 109 , 110, @a)

这在我正常的20-50k行上工作正常。然而,它确实在这个行数上挣扎。我去了一个不那么复杂的版本:

UPDATE Links SET Timestmp = Timestmp, `RandSort` = FLOOR( 1 + RAND( ) *3 )

然而,这也是非常缓慢的。

有没有更好的方法可以做到这一点,而不会长时间锁定桌子?

BTW:查询的Timestmp = Timestmp,部分只是为了阻止更新时间戳:)(否则会更改为当前时间戳)

更新:经过一些建议,我已经将进程从一次执行所有行更改为更少的500批1000.但是,这并不能保证一切都会更新(因为有些人可能不止一次被选中)......但是看到这只是一种随机排序行的方法,这已经足够了。所以最后的查询是:

UPDATE Links SET Timestmp = Timestmp, `RandSort` = FLOOR( 1 + RAND( ) *3 ) ORDER BY RAND() LIMIT 1000

1 个答案:

答案 0 :(得分:1)

根据上述人员提出的一些建议,我已经改变了从一次完成所有行的过程到更小的500批次1000.但是,这并不能保证一切都会更新(如同一些可能会多次被选中)...但是看到这只是一种随机排序行的方法,这已经足够了。所以最后的查询是:

UPDATE Links SET Timestmp = Timestmp, `RandSort` = FLOOR( 1 + RAND( ) *3 ) ORDER BY RAND() LIMIT 1000

感谢大家的帮助。希望这将有助于未来的其他人!