我有一個表有450k行在它(和上升)。我需要用隨機數字更新RandSort
列。我通常在我的其他網站上使用這個:有效更新mySQL中的450k行,隨機數
UPDATE Links SET Timestmp = Timestmp, `RandSort` = if ((@a := floor(8+rand()*113)) BETWEEN 103 AND 109 , 110, @a)
這對我正常的20-50k行很好。然而,它真的與這個行數掙扎。我已經去了一個不那麼複雜的版本:
但是,這也會受到很慢的影響。
有沒有更好的方法可以做到這一點,而不會鎖定表年齡?
BTW:查詢的Timestmp = Timestmp,
一部分,只是從更新停止時間戳:)(否則它更改爲當前時間戳)
UPDATE:一些建議後,我已經改變了從一次做所有的行開始,到500個批次的1000個小批量處理。當然,這並不能保證所有內容都會被更新(因爲有些可能會被選中多次)......但是看到這只是一個對行進行隨機排序的方式,這已經足夠了。所以最終的查詢是:
UPDATE Links SET Timestmp = Timestmp, `RandSort` = FLOOR(1 + RAND() *3) ORDER BY RAND() LIMIT 1000
使用解釋計劃,它會告訴你爲什麼。在沒有「where」語句的情況下使用UPDATE是一個壞主意。如果更新的數據被另一個操作鎖定,它將一直等到它被釋放。 – mootmoot
所以你的意思是做'解釋更新鏈接SET Timestmp = Timestmp,'RandSort \'= FLOOR(1 + RAND()* 3)'? –
@mootmoot - 你是在暗示我這麼做? '更新鏈接SET Timestmp = Timestmp, \ RandSort \'= FLOOR(1 + RAND()* 3)WHERE 1'。這看起來似乎有幫助(它至少貫穿此時 - 即使它需要5分鐘) –