關(guān)于mysql 8.x 中insert ignore的性能問(wèn)題
mysql 8.x中insert ignore性能問(wèn)題
mysql中replace into效率很差,多進(jìn)程并發(fā)一下就會(huì)鎖表,所以應(yīng)該用on duplicate 來(lái)做更新,這是眾所周知的了。沒(méi)想到insert ignore也有性能坑,記錄下遇到的問(wèn)題。
為了往一張表中插入初始化數(shù)據(jù),我開了10個(gè)進(jìn)程并發(fā)向數(shù)據(jù)庫(kù)中使用insert ignore插入數(shù)據(jù),每條insert ignore語(yǔ)句包含7行數(shù)據(jù)。沒(méi)想到上線開始跑腳本以后數(shù)據(jù)庫(kù)出現(xiàn)不少鎖表。根據(jù)innodb status log來(lái)看,鎖住的是表的自增id主鍵。
調(diào)試了半天之后發(fā)現(xiàn),原來(lái)是insert ignore的時(shí)候會(huì)對(duì)插入的每一行數(shù)據(jù)取S鎖做unique id的檢測(cè),同時(shí)會(huì)對(duì)主鍵的自增id字段加寫意向鎖(insert intension),在unique key較為復(fù)雜的時(shí)候,檢測(cè)unique key的時(shí)候會(huì)一直占用主鍵的插入意向鎖,其他insert ignore也想給主鍵id加插入意向鎖,導(dǎo)致死鎖。
以上情況是在mysql 8.x中發(fā)現(xiàn)的,以前用低版本的mysql似乎沒(méi)遇到過(guò)相關(guān)問(wèn)題,所以不清楚低版本mysql的insert ignore是否有坑,但是8.x的版本最好insert ignore不要插入多行數(shù)據(jù),尤其是unique key比較復(fù)雜的時(shí)候(有三四個(gè)字段共同組成)
mysql insert ignore()函數(shù)
INSERT IGNORE語(yǔ)句
當(dāng)您使用該INSERT語(yǔ)句向一個(gè)表中添加多行時(shí),如果在處理過(guò)程中發(fā)生錯(cuò)誤,則MySQL終止該語(yǔ)句并返回錯(cuò)誤。結(jié)果,沒(méi)有行插入到表中。
但是,如果使用該insert ignore語(yǔ)句,則會(huì)忽略包含導(dǎo)致錯(cuò)誤的無(wú)效數(shù)據(jù)的行,并將具有有效數(shù)據(jù)的行插入表中。
insert ignore into actor values (3,'ED','CHASE','2006-02-15 12:34:33')
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL8.0.24版本Release Note的一些改進(jìn)點(diǎn)
這篇文章主要介紹了MySQL8.0.24版本Release Note的一些改進(jìn)點(diǎn),幫助大家更好的對(duì)新版本的MySQL進(jìn)行測(cè)試使用,感興趣的朋友可以了解下2021-04-04
windows10下mysql 8.0 下載與安裝配置圖文教程
這篇文章主要介紹了windows10下mysql 8.0 下載與安裝配置圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02
Centos7下安裝MySQL8.0.23的步驟(小白入門級(jí)別)
這篇文章主要介紹了Centos7下安裝MySQL8.0.23的步驟(小白入門級(jí)別),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
一文搞懂Mysql數(shù)據(jù)庫(kù)中的各種日志
MySQL日志的內(nèi)容非常重要,面試中經(jīng)常會(huì)被問(wèn)到,下面這篇文章主要給大家介紹了關(guān)于Mysql數(shù)據(jù)庫(kù)中各種日志的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用mysql具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-08-08
同時(shí)運(yùn)行多個(gè)MySQL服務(wù)器的方法
在同一臺(tái)機(jī)器上運(yùn)行多個(gè)有些情況下你可能想要在同一臺(tái)機(jī)器上運(yùn)行多個(gè)服務(wù)器。例如,你可能想要測(cè)試一個(gè)新的MySQL版本而讓你現(xiàn)有生產(chǎn)系統(tǒng)的設(shè)置不受到干擾, 或你可能是想要為不同的客戶提供獨(dú)立的MySQL安裝一個(gè)因特網(wǎng)服務(wù)供應(yīng)商。2008-05-05

