1. 程式人生 > 其它 >ON DUPLICATE KEY UPDATE 導致mysql自增主鍵ID跳躍增長

ON DUPLICATE KEY UPDATE 導致mysql自增主鍵ID跳躍增長

一. 問題點:

1. 如果mysql表只是設定了聯合主鍵且不包含自增的id, 則使用ON DUPLICATE KEY UPDATE不會有問題

2. 如果mysql表設定了自增主鍵id, 則使用ON DUPLICATE KEY UPDATE可能會造成自增id跳躍增長

二. 解決:

1、從專案程式碼邏輯出發

可以改變程式碼邏輯,變成先執行update方法,然後判斷返回值是否等於0,如果返回值等於0則證明沒有資料變動,否則執行insert方法。

這樣可以解決問題,但是從之前的一次sql變為了兩次,會導致效率低下。 

2、從問題出發:ON DUPLICATE key update會在update時主鍵也會自增+1

首先需要在配置中支援多條sql語句執行, 預設為false,這裡需要改為true:

然後在insert之前增加一條sql語句

設定完之後就可以解決ON DUPLICATE key update會在update時主鍵也會自增+1這個問題了,但是這樣每次在執行這個sql時都會呼叫alter table wss_production_model auto_increment=1,這樣也會導致效率會變低。

3、從Mysql配置出發

修改innodb_autoinc_lock_mode配置

innodb_autoinc_lock_mode中有3種模式, 0、1、2, mysql預設為1,

0:每次分配自增id的時候都會鎖表,這個對併發不太支援
1:只有在bulk insert的時候才會鎖表,簡單insert的時候只會使用一個light-weight mutex,比0的併發效能高 2:很多不保證,不太安全,不建議使用

修改為0則可以解決問題,然而修改完後會導致在高併發下效率低下,而且線上資料庫和本地資料庫的配置要同步,這裡不推薦使用這種方法。

三. 總結

具體解決方案可以根據專案來選擇,如果專案不大,可以考慮1和2。如果不考慮高併發問題,可以考慮3。