這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)如何用INSERT DELAYED解決MySQL堵塞問(wèn)題,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
創(chuàng)新互聯(lián)專注于雙陽(yáng)網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供雙陽(yáng)營(yíng)銷型網(wǎng)站建設(shè),雙陽(yáng)網(wǎng)站制作、雙陽(yáng)網(wǎng)頁(yè)設(shè)計(jì)、雙陽(yáng)網(wǎng)站官網(wǎng)定制、微信小程序服務(wù),打造雙陽(yáng)網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供雙陽(yáng)網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
由于對(duì)MySQL的并發(fā)插入數(shù)據(jù)能力沒(méi)有一個(gè)很好的評(píng)估,因此在些多進(jìn)程并發(fā)程序時(shí),忽略了MySQL的堵塞問(wèn)題 以至程序時(shí)不時(shí)因?yàn)镸ySQL的堵塞,導(dǎo)致子進(jìn)程一直在等待MySQL釋放堵塞,完成INSERT 指令。
故障現(xiàn)象:
堵塞的子進(jìn)程都是 sbwait 狀態(tài)
父進(jìn)程,一直在等待子進(jìn)程結(jié)束,是wait狀態(tài)
如果不手工kill掉堵塞的子進(jìn)程,這些進(jìn)程一直存在
原因排查:開始懷疑是socket部分的問(wèn)題。以為是由于連接服務(wù)器時(shí),在等待對(duì)方關(guān)閉連接而引起的堵塞。
花了很長(zhǎng)一段時(shí)間來(lái)檢查和調(diào)試socket部分的代碼,幾次以為已經(jīng)解決了的時(shí)候,又出現(xiàn)故障,都是以失敗告終。 這個(gè)周末,重新將整個(gè)socket連接,數(shù)據(jù)庫(kù)連接逐一檢查。發(fā)現(xiàn),sbwait 狀態(tài)時(shí),是由于MySQL的堵塞引起的。多進(jìn)程并發(fā)的情況下,同時(shí)搶占MySQL的資源。而MySQL默認(rèn)表類型,是表鎖定的。當(dāng)A子進(jìn)程鎖定進(jìn)行插入時(shí),B子進(jìn)程只能等待。以至并發(fā)時(shí),發(fā)生堵塞現(xiàn)象。
解決辦法:
優(yōu)化表結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu)
更改INSERT INTO為 INSERT DELAYED INTO
更改程序結(jié)構(gòu),讓每個(gè)子進(jìn)程各自打開一個(gè)MySQL連接
說(shuō)明: INSERT DELAYED INTO,是客戶端提交數(shù)據(jù)給MySQL,MySQL返回OK狀態(tài)給客戶端。而這是并不是已經(jīng)將數(shù)據(jù)插入表,而是存儲(chǔ)在內(nèi)存里面等待排隊(duì)。當(dāng)mysql有空余時(shí),再插入。
這樣的好處是,提高插入的速度,客戶端不需要等待太長(zhǎng)時(shí)間。壞處是,不能返回自動(dòng)遞增的ID,以及系統(tǒng)崩潰時(shí),MySQL還沒(méi)有來(lái)得及插入數(shù)據(jù)的話,這些數(shù)據(jù)將會(huì)丟失。
觀測(cè):做這些調(diào)整后,運(yùn)行了一天,沒(méi)有出現(xiàn)堵塞情況。并且運(yùn)行時(shí)間也縮短了。 通過(guò)phpMyAdmin觀測(cè)MySQL的進(jìn)程,提交后,會(huì)有一些用戶為DELAYED,狀態(tài)為Waiting for INSERT的進(jìn)程。過(guò)一會(huì),數(shù)據(jù)完全插入后就消失了。
上述就是小編為大家分享的如何用INSERT DELAYED解決MySQL堵塞問(wèn)題了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。