2016-06-10 54 views
0

我有一個表有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 
+0

使用解釋計劃,它會告訴你爲什麼。在沒有「where」語句的情況下使用UPDATE是一個壞主意。如果更新的數據被另一個操作鎖定,它將一直等到它被釋放。 – mootmoot

+0

所以你的意思是做'解釋更新鏈接SET Timestmp = Timestmp,'RandSort \'= FLOOR(1 + RAND()* 3)'? –

+0

@mootmoot - 你是在暗示我這麼做? '更新鏈接SET Timestmp = Timestmp, \ RandSort \'= FLOOR(1 + RAND()* 3)WHERE 1'。這看起來似乎有幫助(它至少貫穿此時 - 即使它需要5分鐘) –

回答

1

從上面的人一些建議後,我從同時做所有的行改變的過程中,做的1000誠然小批量500,這並不能保證一切都會被更新(因爲有些可能會被選中不止一次)......但是由於這只是一種隨機排列行的方式,所以這已經足夠了。所以最後的查詢是:

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

謝謝大家的幫助。希望這將有助於未來的其他人!

+0

感謝分享Andrew:p – Drew