Mysql 百問系列: 鏈接管理如何高效工做?

問題

1.鏈接器負責什麼?
2.什麼是長鏈接?什麼是短鏈接?
3.什麼是鏈接線程池?
4.平時工做中能夠如何優化鏈接數? mysql

創建鏈接

鏈接器負責跟客戶端創建鏈接、獲取權限、維持和管理鏈接。
通常咱們會經過如下形式訪問數據庫。 這種方式爲 TCP/IP 方式web

mysql -h$ip -P$port -u$user -p
複製代碼

固然若是客戶端和數據庫都在一臺機器上,可使用Unix Sockets方式sql

mysql -uroot
複製代碼

創建鏈接後,鏈接器會到權限表裏面查出你擁有的權限。以後,這個鏈接裏面的權限判斷邏輯,都將依賴於此時讀到的權限。一個用戶成功創建鏈接後,即便你用管理員帳號對這個用戶的權限作了修改,也不會影響已經存在鏈接的權限。修改完成後,只有再新建的鏈接纔會使用新的權限設置。 數據庫

何時斷開鏈接?

根據斷開鏈接的時機,把鏈接分爲:長鏈接短鏈接緩存

  • 長鏈接: 進行鏈接後,能夠發送屢次請求,知道客戶端手動斷開鏈接。 若是鏈接後線程一直處於sleep狀態(指沒有處理任何請求)那麼通過wait_timeout時間後將自動斷開鏈接,默認是8小時。
  • 短鏈接: 進行鏈接後,發送一次請求後就斷開鏈接。下一次數據庫請求必須從新進行鏈接。

短鏈接會頻繁建立鏈接,若是在繁忙系統中可能會致使系統端口數被耗盡,從而沒法鏈接。
長鏈接雖然避免了頻繁的建立鏈接,可是鏈接過程當中請求使用到的內存空間須要到鏈接關閉才釋放。因此若是長鏈接時間過長,可能會致使數據庫內存猛增。
以PHP爲例:服務器

  1. 當咱們以PHP作爲web服務時,一個請求中可能屢次訪問數據庫,查詢或者修改數據。通常狀況下(不進行特殊設置),都是使用長鏈接的方式進行訪問的。當請求結束,接口返回響應。這個長鏈接就斷開了。能夠經過 show processlist 來查看當前全部鏈接。
  2. 若是利用PHP編寫了一個常駐腳本,而且腳本中進行了數據庫訪問,那麼這個長鏈接可能一直存在着(應該儘可能避免這種狀況)。

我在項目中碰到過有一個狀況是,編寫了一個腳本,訂閱一個消息隊列,從隊列消費消息,而後根據消息內容,讀寫數據庫。可是因爲前期業務量不足,消息隊列可能很長一段時間沒有消息消費,超過8小時後就致使了鏈接自動斷開。 對於這種常駐腳本,推薦作法是每隔一段時間手動斷開數據庫鏈接,而後重連。或者執行了一些列複雜數據庫請求後,斷開鏈接,下次請求時從新鏈接網絡

什麼是鏈接線程池?

通常狀況下,每一個鏈接對應一個線程。
MySQL鏈接管理器線程負責處理服務器偵聽的網絡接口上的客戶端鏈接請求。
一旦有鏈接請求過來就新建線程來處理。可是新建線程的成本是比較昂貴的,因此Mysql使用一個線程池來緩存空閒的線程,以備後來的鏈接使用。
鏈接管理線程處理客戶端鏈接請求過程是:
1.查看線程池中是否包含空閒的線程,若是有,取出一個線程給客戶端鏈接請求。
2.若是沒有空閒線程,查看已有鏈接數是否超過了最大鏈接數,若是沒有,則建立新的線程處理客戶端鏈接請求。併發

如何優化鏈接

首先有個重要的參數叫max_connections,它指Mysql 最大鏈接數,例如設置爲5,那麼最多隻有5個客戶端能夠同時鏈接。固然Mysql爲root用戶作了一個特殊處理,當鏈接數已經滿時,root用戶仍是能夠鏈接上一個。也就是說最大其實能夠容許max_connections + 1個root鏈接。
查看最大鏈接數性能

show variables like '%max_connections%';
複製代碼

設置最大鏈接數,服務重啓失效。 若是爲了永久生效能夠修改.cnf文件。優化

set GLOBAL max_connections = 200;
複製代碼

咱們能夠查看過去最大鏈接數,獲得過去最多有過多少鏈接。

show global status like 'max_used_connections';
複製代碼

那麼爲了給服務器留有餘地,建議 max_used_connections/max_connections = 0.8

查看線程狀況

show status like 'Threads%'
複製代碼
  • Threads_cached 標識被緩存的空閒線程數量
  • Threads_connected 表示處於鏈接狀態的線程數量
  • Threads_running 表示正在執行查詢,傳輸數據等操做的線程數量

能夠經過控制thread_cache_size來控制緩存線程池的大小。 併發增長的狀況下,增長這個值能夠改善系統性能。
查看能夠緩存多少鏈接

show global variables like 'thread_cache_size';
複製代碼

總結

  • Mysql 鏈接分爲長鏈接短鏈接
  • 鏈接數量由max_connections控制,合理設置max_connectionsthread_cache_size能夠改善系統性能。
相關文章
相關標籤/搜索