mysql數(shù)據(jù)庫每次查詢是一條線程嗎?
問題描述
對于mysql的查詢,請問是IO復(fù)用,線程池,進(jìn)程池中的哪種模型?或者是其他模型?可以配置嗎?
問題解答
回答1:MySQL的查詢使用的是線程池。當(dāng)有大量請求并發(fā)訪問時(shí),一定伴隨著資源的不斷創(chuàng)建和釋放,導(dǎo)致資源利用率低,降低了服務(wù)質(zhì)量。線程池技術(shù),預(yù)先會(huì)創(chuàng)建一定數(shù)量的線程,當(dāng)有請求達(dá)到時(shí),線程池分配一個(gè)線程提供服務(wù),請求結(jié)束后,該線程又去服務(wù)其他請求。 通過這種方式,避免了線程和內(nèi)存對象的頻繁創(chuàng)建和釋放,降低了服務(wù)端的并發(fā)度,減少了上下文切換和資源的競爭,提高資源利用效率。在MySQL早期的版本中,處理連接的方式是One-Connection-Per-Thread,即對于每一個(gè)數(shù)據(jù)庫連接,MySQL-Server都會(huì)創(chuàng)建一個(gè)獨(dú)立的線程服務(wù),請求結(jié)束后,銷毀線程。再來一個(gè)連接請求,則再創(chuàng)建一個(gè)連接,結(jié)束后再進(jìn)行銷毀。但是,這種方式在高并發(fā)情況下,會(huì)導(dǎo)致線程的頻繁創(chuàng)建和釋放。當(dāng)然,通過thread-cache,我們可以將線程緩存起來,以供下次使用,避免頻繁創(chuàng)建和釋放的問題,但是無法解決高連接數(shù)的問題。One-Connection-Per-Thread方式隨著連接數(shù)暴增,導(dǎo)致需要?jiǎng)?chuàng)建同樣多的服務(wù)線程,高并發(fā)線程意味著高的內(nèi)存消耗,更多的上下文切換(cpu cache命中率降低)以及更多的資源競爭,導(dǎo)致服務(wù)出現(xiàn)抖動(dòng)。相對于One-Thread-Per-Connection方式,一個(gè)線程對應(yīng)一個(gè)連接,Thread-Pool實(shí)現(xiàn)方式中,線程處理的最小單位是statement(語句),一個(gè)線程可以處理多個(gè)連接的請求。這樣,在保證充分利用硬件資源情況下(合理設(shè)置線程池大小),可以避免瞬間連接數(shù)暴增導(dǎo)致的服務(wù)器抖動(dòng)。
相關(guān)文章:
1. docker images顯示的鏡像過多,狗眼被亮瞎了,怎么辦?2. 大家好,請問在python腳本中怎么用virtualenv激活指定的環(huán)境?3. Matlab和Python編程相似嗎,有兩種都學(xué)過的人可以說說嗎4. 請教各位大佬,瀏覽器點(diǎn) 提交實(shí)例為什么沒有反應(yīng)5. javascript - Html5做移到端定位,獲取授權(quán)拒絕了怎么辦?6. 網(wǎng)頁爬蟲 - 用Python3的requests庫模擬登陸B(tài)ilibili總是提示驗(yàn)證碼錯(cuò)誤怎么辦?7. android - QQ物聯(lián),視頻通話8. javascript - 關(guān)于audio標(biāo)簽暫停的問題9. javascript - 微信小程序封裝定位問題(封裝異步并可能多次請求)10. javascript - Web微信聊天輸入框解決方案
