我的表中有 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
答案 0 :(得分:1)
根据上述人员提出的一些建议,我已经改变了从一次完成所有行的过程到更小的500批次1000.但是,这并不能保证一切都会更新(如同一些可能会多次被选中)...但是看到这只是一种随机排序行的方法,这已经足够了。所以最后的查询是:
UPDATE Links SET Timestmp = Timestmp, `RandSort` = FLOOR( 1 + RAND( ) *3 ) ORDER BY RAND() LIMIT 1000
感谢大家的帮助。希望这将有助于未来的其他人!