首頁 >資料庫 >mysql教程 >mysql8.x中insert ignore的效能問題怎麼解決

mysql8.x中insert ignore的效能問題怎麼解決

PHPz
PHPz轉載
2023-06-03 11:25:112842瀏覽

mysql 8.x中insert ignore效能問題

mysql中replace into效率很差,多進程並發一下就會鎖表,所以應該用on duplicate 來做更新,這是眾所周知的了。沒想到即使使用了insert ignore操作,也可能會遇到效能問題,我想記錄我遇到的這個問題。

為了往一張表中插入初始化數據,我開了10個進程並發向資料庫中使用insert ignore插入數據,每條insert ignore語句包含7行數據。沒想到上線開始跑腳本以後資料庫出現不少鎖表。從innodb狀態日誌來看,被鎖定的是表的自增id的主鍵。

調試了半天之後發現,原來是insert ignore的時候會對插入的每一行資料取S鎖做unique id的檢測,同時會對主鍵的自增id字段加寫意向鎖(insert intension ),在unique key較為複雜的時候,偵測unique key的時候會一直佔用主鍵的插入意向鎖,其他insert ignore也想給主鍵id加插入意向鎖,導致死鎖。

以上情況是在mysql 8.x中發現的,以前用低版本的mysql似乎沒遇到過相關問題,所以不清楚低版mysql的insert ignore是否有坑,但是8.x的版本最好insert ignore不要插入多行數據,尤其是unique key比較複雜的時候(有三四個字段共同組成)

mysql insert ignore()函數

INSERT IGNORE語句

當您使用該INSERT語句在一個表中新增多行時,如果在處理過程中發生錯誤,則MySQL終止該語句並傳回錯誤。結果,沒有行插入到表中。

但是,如果使用該insert ignore語句,則會忽略包含導致錯誤的無效資料的行,並將具有有效資料的行插入表中。

insert ignore into actor values (3,'ED','CHASE','2006-02-15 12:34:33')

以上是mysql8.x中insert ignore的效能問題怎麼解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除