1.鏈接器負責什麼?
2.什麼是長鏈接?什麼是短鏈接?
3.什麼是鏈接線程池?
4.平時工做中能夠如何優化鏈接數? mysql
鏈接器負責跟客戶端創建鏈接、獲取權限、維持和管理鏈接。
通常咱們會經過如下形式訪問數據庫。 這種方式爲 TCP/IP 方式
。web
mysql -h$ip -P$port -u$user -p
複製代碼
固然若是客戶端和數據庫都在一臺機器上,可使用Unix Sockets方式
sql
mysql -uroot
複製代碼
創建鏈接後,鏈接器會到權限表裏面查出你擁有的權限。以後,這個鏈接裏面的權限判斷邏輯,都將依賴於此時讀到的權限。一個用戶成功創建鏈接後,即便你用管理員帳號對這個用戶的權限作了修改,也不會影響已經存在鏈接的權限。修改完成後,只有再新建的鏈接纔會使用新的權限設置。 數據庫
根據斷開鏈接的時機,把鏈接分爲:長鏈接
和短鏈接
緩存
wait_timeout
時間後將自動斷開鏈接,默認是8小時。短鏈接會頻繁建立鏈接,若是在繁忙系統中可能會致使系統端口數被耗盡,從而沒法鏈接。
長鏈接雖然避免了頻繁的建立鏈接,可是鏈接過程當中請求使用到的內存空間須要到鏈接關閉才釋放。因此若是長鏈接時間過長,可能會致使數據庫內存猛增。
以PHP爲例:服務器
長鏈接
的方式進行訪問的。當請求結束,接口返回響應。這個長鏈接就斷開了。能夠經過 show processlist 來查看當前全部鏈接。我在項目中碰到過有一個狀況是,編寫了一個腳本,訂閱一個消息隊列,從隊列消費消息,而後根據消息內容,讀寫數據庫。可是因爲前期業務量不足,消息隊列可能很長一段時間沒有消息消費,超過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%'
複製代碼
能夠經過控制thread_cache_size
來控制緩存線程池的大小。 併發增長的狀況下,增長這個值能夠改善系統性能。
查看能夠緩存多少鏈接
show global variables like 'thread_cache_size';
複製代碼
長鏈接
和短鏈接
max_connections
和thread_cache_size
能夠改善系統性能。