mysql數據庫每次查詢是一條線程嗎?
問題描述
對于mysql的查詢,請問是IO復用,線程池,進程池中的哪種模型?或者是其他模型?可以配置嗎?
問題解答
回答1:MySQL的查詢使用的是線程池。當有大量請求并發訪問時,一定伴隨著資源的不斷創建和釋放,導致資源利用率低,降低了服務質量。線程池技術,預先會創建一定數量的線程,當有請求達到時,線程池分配一個線程提供服務,請求結束后,該線程又去服務其他請求。 通過這種方式,避免了線程和內存對象的頻繁創建和釋放,降低了服務端的并發度,減少了上下文切換和資源的競爭,提高資源利用效率。在MySQL早期的版本中,處理連接的方式是One-Connection-Per-Thread,即對于每一個數據庫連接,MySQL-Server都會創建一個獨立的線程服務,請求結束后,銷毀線程。再來一個連接請求,則再創建一個連接,結束后再進行銷毀。但是,這種方式在高并發情況下,會導致線程的頻繁創建和釋放。當然,通過thread-cache,我們可以將線程緩存起來,以供下次使用,避免頻繁創建和釋放的問題,但是無法解決高連接數的問題。One-Connection-Per-Thread方式隨著連接數暴增,導致需要創建同樣多的服務線程,高并發線程意味著高的內存消耗,更多的上下文切換(cpu cache命中率降低)以及更多的資源競爭,導致服務出現抖動。相對于One-Thread-Per-Connection方式,一個線程對應一個連接,Thread-Pool實現方式中,線程處理的最小單位是statement(語句),一個線程可以處理多個連接的請求。這樣,在保證充分利用硬件資源情況下(合理設置線程池大小),可以避免瞬間連接數暴增導致的服務器抖動。
相關文章:
1. angular.js - 輸入郵箱地址之后, 如何使其自動在末尾添加分號?2. angular.js - $stateChangeSuccess事件在狀態跳轉的時候不執行?3. 如何解決docker宿主機無法訪問容器中的服務?4. javascript - 如何使用nodejs 將.html 文件轉化成canvas5. python - Scrapy存在內存泄漏的問題。6. android - rxjava merge 返回Object對象數據如何緩存7. 如何用筆記本上的apache做微信開發的服務器8. javascript - 螞蟻金服里的react Modal方法,是怎么把元素插入到頁面最后的9. java如何生成token?10. CSS3 畫如下圖形
