mysql數(shù)據(jù)庫每次查詢是一條線程嗎?
問題描述
對(duì)于mysql的查詢,請(qǐng)問是IO復(fù)用,線程池,進(jìn)程池中的哪種模型?或者是其他模型?可以配置嗎?
問題解答
回答1:MySQL的查詢使用的是線程池。當(dāng)有大量請(qǐng)求并發(fā)訪問時(shí),一定伴隨著資源的不斷創(chuàng)建和釋放,導(dǎo)致資源利用率低,降低了服務(wù)質(zhì)量。線程池技術(shù),預(yù)先會(huì)創(chuàng)建一定數(shù)量的線程,當(dāng)有請(qǐng)求達(dá)到時(shí),線程池分配一個(gè)線程提供服務(wù),請(qǐng)求結(jié)束后,該線程又去服務(wù)其他請(qǐng)求。 通過這種方式,避免了線程和內(nèi)存對(duì)象的頻繁創(chuàng)建和釋放,降低了服務(wù)端的并發(fā)度,減少了上下文切換和資源的競(jìng)爭(zhēng),提高資源利用效率。在MySQL早期的版本中,處理連接的方式是One-Connection-Per-Thread,即對(duì)于每一個(gè)數(shù)據(jù)庫連接,MySQL-Server都會(huì)創(chuàng)建一個(gè)獨(dú)立的線程服務(wù),請(qǐng)求結(jié)束后,銷毀線程。再來一個(gè)連接請(qǐng)求,則再創(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命中率降低)以及更多的資源競(jìng)爭(zhēng),導(dǎo)致服務(wù)出現(xiàn)抖動(dòng)。相對(duì)于One-Thread-Per-Connection方式,一個(gè)線程對(duì)應(yīng)一個(gè)連接,Thread-Pool實(shí)現(xiàn)方式中,線程處理的最小單位是statement(語句),一個(gè)線程可以處理多個(gè)連接的請(qǐng)求。這樣,在保證充分利用硬件資源情況下(合理設(shè)置線程池大小),可以避免瞬間連接數(shù)暴增導(dǎo)致的服務(wù)器抖動(dòng)。
相關(guān)文章:
1. python bottle跑起來以后,定時(shí)執(zhí)行的任務(wù)為什么每次都重復(fù)(多)執(zhí)行一次?2. python - 爬蟲模擬登錄后,爬取csdn后臺(tái)文章列表遇到的問題3. html5 - HTML代碼中的文字亂碼是怎么回事?4. 視頻文件不能播放,怎么辦?5. javascript - vue2如何獲取v-model變量名6. javascript - 求幫助 , ATOM不顯示界面!!!!7. mysql - 分庫分表、分區(qū)、讀寫分離 這些都是用在什么場(chǎng)景下 ,會(huì)帶來哪些效率或者其他方面的好處8. javascript - 為什么在谷歌控制臺(tái) 輸出1的時(shí)候,輸出的1立馬就不見了9. javascript - angular使從elastichearch中取出的文本高亮顯示,如圖所示10. javascript - ios返回不執(zhí)行js怎么解決?
