2010-01-20 76 views
0

使用InnoDB時,有沒有辦法在MySQL中執行低優先級更新?發佈低優先級更新

我運行一個非常高負載的應用那裏可以很容易地從字面上成千上萬的用戶試圖同時更新相同的數據記錄。這主要是基於會話的統計信息,如果有與請求相關的等待時間,其中大部分可以忽略。我希望能夠檢查某些表/行是否被鎖定,如果是這樣,則不會將更新查詢傳遞給服務器。那可能嗎?

+0

@clops:我在文檔中注意到UPDATE LOW_PRIORITY和ISERT DELAYED不適用於InnoDB,所以刪除了答案。 – Veger 2010-01-20 15:27:29

+0

完全沒問題!不管怎麼說,還是要謝謝你! – clops 2010-01-20 16:40:04

回答

0

如果你這麼說是有時間限制與您可以使用存儲過程跳過某些更新

請求

事情是這樣的:

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `updateStats` $$ 

CREATE PROCEDURE updateStats() 
BEGIN 

DECLARE _B smallint(1) DEFAULT 0; 
DECLARE _SECONDS INT DEFAULT 1; 

-- http://dev.mysql.com/doc/refman/5.0/en/lock-tables-and-transactions.html 
SELECT GET_LOCK('myLabel1',_SECONDS) INTO _B; 
IF _B = 1 THEN 
    UPDATE table SET ........; 
    SLEEP(_SECONDS); 
    SELECT RELEASE_LOCK('myLabel1') INTO _B; 
END IF; 
END 

這將確保,如果你有鎖,持續_SECONDS您確保沒有其他過程在該時間框架中運行相同的代碼。 睡眠需要保持1秒鎖定(好像SP終止更快,鎖定被釋放)

您還可以將一個else節點添加到if,因此它存儲過程無法更新,要做自定義代碼,如添加到隊列中。

假設你想只在1秒間隔寫入到活動表不加載太多,也許你有很多關於它的索引。在else節點上,您可以更新另一個充當隊列的表,並且當您也進行更新時,隊列將在IF true節點中清空。

1

你試過在my.cnf文件中設置low_priority_updates=1嗎?當更新或插入會鎖定表時,這應該使select查詢具有優先權。

0

因此,您的用戶應用程序不會等待更新完成,並且不關心它是否完成,這可能是使用後臺處理管理器(如Gearman)的合適上下文嗎?