關(guān)于mysql 8.x 中insert ignore的性能問題
mysql 8.x中insert ignore性能問題
mysql中replace into效率很差,多進(jìn)程并發(fā)一下就會鎖表,所以應(yīng)該用on duplicate 來做更新,這是眾所周知的了。沒想到insert ignore也有性能坑,記錄下遇到的問題。
為了往一張表中插入初始化數(shù)據(jù),我開了10個進(jìn)程并發(fā)向數(shù)據(jù)庫中使用insert ignore插入數(shù)據(jù),每條insert ignore語句包含7行數(shù)據(jù)。沒想到上線開始跑腳本以后數(shù)據(jù)庫出現(xiàn)不少鎖表。根據(jù)innodb status log來看,鎖住的是表的自增id主鍵。
調(diào)試了半天之后發(fā)現(xiàn),原來是insert ignore的時候會對插入的每一行數(shù)據(jù)取S鎖做unique id的檢測,同時會對主鍵的自增id字段加寫意向鎖(insert intension),在unique key較為復(fù)雜的時候,檢測unique key的時候會一直占用主鍵的插入意向鎖,其他insert ignore也想給主鍵id加插入意向鎖,導(dǎo)致死鎖。
以上情況是在mysql 8.x中發(fā)現(xiàn)的,以前用低版本的mysql似乎沒遇到過相關(guān)問題,所以不清楚低版本mysql的insert ignore是否有坑,但是8.x的版本最好insert ignore不要插入多行數(shù)據(jù),尤其是unique key比較復(fù)雜的時候(有三四個字段共同組成)
mysql insert ignore()函數(shù)
INSERT IGNORE語句
當(dāng)您使用該INSERT語句向一個表中添加多行時,如果在處理過程中發(fā)生錯誤,則MySQL終止該語句并返回錯誤。結(jié)果,沒有行插入到表中。
但是,如果使用該insert ignore語句,則會忽略包含導(dǎo)致錯誤的無效數(shù)據(jù)的行,并將具有有效數(shù)據(jù)的行插入表中。
insert ignore into actor values (3,'ED','CHASE','2006-02-15 12:34:33')
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Lost connection to MySQL server during query的解決
經(jīng)常在執(zhí)行sql語句時,會發(fā)現(xiàn)這個問題,一般就是連接mysql數(shù)據(jù)庫不穩(wěn)定2008-06-06SQL聯(lián)合查詢inner join、outer join和cross join的區(qū)別詳解
今天小編就為大家分享一篇關(guān)于SQL聯(lián)合查詢inner join、outer join和cross join的區(qū)別詳解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03PureFTP借助MySQL實現(xiàn)用戶身份驗證的操作教程
這篇文章主要介紹了PureFTP借助MySQL實現(xiàn)用戶身份驗證的操作教程,就像普通程序中的用戶注冊功能那樣為用戶登陸數(shù)據(jù)信息建立一個數(shù)據(jù)庫來進(jìn)行驗證,需要的朋友可以參考下2015-12-12在OneProxy的基礎(chǔ)上實行MySQL讀寫分離與負(fù)載均衡
基于Libevent機(jī)制實現(xiàn),單個實例可以實現(xiàn)25萬的SQL轉(zhuǎn)發(fā)能力,用一個OneProxy節(jié)點可以帶動整個MySQL集群,為業(yè)務(wù)發(fā)展貢獻(xiàn)一份力量,下面由小編來為大家簡單說說2019-05-05