溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何用INSERT DELAYED解決MySQL堵塞問題

發(fā)布時間:2021-11-30 16:15:04 來源:億速云 閱讀:320 作者:柒染 欄目:數(shù)據(jù)庫

這期內(nèi)容當中小編將會給大家?guī)碛嘘P如何用INSERT DELAYED解決MySQL堵塞問題,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

由于對MySQL的并發(fā)插入數(shù)據(jù)能力沒有一個很好的評估,因此在些多進程并發(fā)程序時,忽略了MySQL的堵塞問題 以至程序時不時因為MySQL的堵塞,導致子進程一直在等待MySQL釋放堵塞,完成INSERT  指令。 

 故障現(xiàn)象:

  • 堵塞的子進程都是 sbwait 狀態(tài)

  • 父進程,一直在等待子進程結束,是wait狀態(tài)

  • 如果不手工kill掉堵塞的子進程,這些進程一直存在

 原因排查:開始懷疑是socket部分的問題。以為是由于連接服務器時,在等待對方關閉連接而引起的堵塞。   

花了很長一段時間來檢查和調試socket部分的代碼,幾次以為已經(jīng)解決了的時候,又出現(xiàn)故障,都是以失敗告終。   這個周末,重新將整個socket連接,數(shù)據(jù)庫連接逐一檢查。發(fā)現(xiàn),sbwait 狀態(tài)時,是由于MySQL的堵塞引起的。多進程并發(fā)的情況下,同時搶占MySQL的資源。而MySQL默認表類型,是表鎖定的。當A子進程鎖定進行插入時,B子進程只能等待。以至并發(fā)時,發(fā)生堵塞現(xiàn)象。 

 解決辦法:

  • 優(yōu)化表結構和數(shù)據(jù)結構

  • 更改INSERT INTO為 INSERT DELAYED INTO

  • 更改程序結構,讓每個子進程各自打開一個MySQL連接

說明: INSERT DELAYED INTO,是客戶端提交數(shù)據(jù)給MySQL,MySQL返回OK狀態(tài)給客戶端。而這是并不是已經(jīng)將數(shù)據(jù)插入表,而是存儲在內(nèi)存里面等待排隊。當mysql有空余時,再插入。

這樣的好處是,提高插入的速度,客戶端不需要等待太長時間。壞處是,不能返回自動遞增的ID,以及系統(tǒng)崩潰時,MySQL還沒有來得及插入數(shù)據(jù)的話,這些數(shù)據(jù)將會丟失。 

 觀測:做這些調整后,運行了一天,沒有出現(xiàn)堵塞情況。并且運行時間也縮短了。 通過phpMyAdmin觀測MySQL的進程,提交后,會有一些用戶為DELAYED,狀態(tài)為Waiting for INSERT的進程。過一會,數(shù)據(jù)完全插入后就消失了。

上述就是小編為大家分享的如何用INSERT DELAYED解決MySQL堵塞問題了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI