Mysql

重複密鑰更新 - 每天百萬次優化?

  • August 7, 2020

我每天數百萬次使用具有不同變數的以下查詢,我想知道是否有任何方法可以優化它:

   INSERT INTO campaign_stats (user_id, date, $country) 
   VALUES      (:user_id, :date, :country) 
   ON DUPLICATE KEY UPDATE $country=$country+1

99% 的情況下ON DUPLICATE KEY UPDATE $country=$country+1都是正確的,所以最好先檢查一下?

該表InnoDB,對嗎?(如果沒有,這種變化將很重要。)

如果有一AUTO_INCREMENT列,您每天將燒掉一百萬個值中的大部分。請提供SHOW CREATE TABLE

這大約是 12/秒——不是致命的變化率。

請為 IODKU 計時並為以下時間計時,然後報告:

UPDATE ... country=country+1;
if rows_affected = 0 then
INSERT ...,

我懷疑它們的速度差不多,但我還沒有測試過。

糟糕,我在該程式碼中有一個微妙的錯誤——如果另一個執行緒潛入並在我摸索 rows_affected 時執行插入,那麼插入可能會得到“dup key”。解決方法:將 INSERT 更改為 IODKU。

如果最終超過 100/秒,請考慮收集這些值,然後修補應用它們。我可能會在http://mysql.rjweb.org/doc.php/staging_table上做一個變體。

而不是檢查它(我認為您的意思是SELECT在更新/插入之前執行),您只需發出UPDATE,如果受影響的行數為 0,則執行INSERT

SELECT然後在大多數情況下執行 1 條語句 INSERT相比,然後執行 2 條語句。UPDATE

INSERT ... ON DUPLICATE KEY UPDATE但是,與if相比,這兩種方法都會快得多

  • 它大部分時間都執行更新

  • 你在插入觸發器之前

在檢查約束之前觸發插入觸發器之前,然後由於違反唯一約束而導致插入失敗,觸發器所做的數據更改將被回滾(全部在幕後),最後更新成功完成。

引用自:https://dba.stackexchange.com/questions/193227