Mysql
重複密鑰更新 - 每天百萬次優化?
我每天數百萬次使用具有不同變數的以下查詢,我想知道是否有任何方法可以優化它:
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相比,這兩種方法都會快得多
它大部分時間都執行更新
你在插入觸發器之前
在檢查約束之前觸發插入觸發器之前,然後由於違反唯一約束而導致插入失敗,觸發器所做的數據更改將被回滾(全部在幕後),最後更新成功完成。