您好,登錄后才能下訂單哦!
這期內(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è)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。