mysql連接優化主要指客戶端mysql以及數據庫為響應客戶端的請求而打開數據表和mysql的過程中涉及到的參數調整。下面我們來詳細的探討下
上文MySQL優化之mysql優化 這篇文章中提到了一個很重要的概念,就是show variables是用來表示系統編譯或者配置在my.cnf中的mysql值。而show status則稱之為mysql值,顯示的是當前服務實例運行所具有的狀態信息,是一個動態改變的值。因此常用來觀測當前MySQl的運行是否正常,如果不正常那么依靠調整mysql參數來提高MySQL的性能。所以明白這兩個概念的不同,是后面調優的基礎。
MySQL 連接優化
記得有一次在公司內部連接MySQL的時候,總是連接不上。找到DBA后,經過排查原因,是當前mysql連接數滿了,經過調整后,解決了問題。引發連接數過多的錯誤原因一般有兩個,第一的確是有很多人在連接MySQL,造成連接數用完。第二種是max_connections值過小。
1、連接參數(show variables)
mysql>?show?variables?like?'%connect%'; +-----------------------------------------------+-----------------+ |?Variable_name?????????????????|?Value??????| +-----------------------------------------------+-----------------+ |?character_set_connection???????????|?utf8??????| |?collation_connection?????????????|?utf8_general_ci?| |?connect_timeout????????????????|?10???????| |?disconnect_on_expired_password????????|?ON???????| |?init_connect?????????????????|?????????| |?max_connect_errors??????????????|?100???????| |?max_connections????????????????|?151???????| |?max_user_connections?????????????|?0????????| |?performance_schema_session_connect_attrs_size?|?512???????| +-----------------------------------------------+-----------------+
max_connections是指MySQL服務實例能夠同時接受的的最大并發連接數。MySQL實際上支持最大連接數加一的算法,保障當連接數用完的時候,超級管理員依然可以和服務端建立連接,進行管理。
max_user_connections設置指定賬號的最大并發連接數。
max_connect_errors 當某臺非法主機惡意連接MySQL服務端,遭到的錯誤達到設置值后,MySQL會解決來自該主機的所有連接。但執行mysql hosts后會清零。
2、連接狀態(show status)
有一點需要注意的,變量值(show variables)是以小寫字母開頭的,而狀態值(show status)是以大寫字母開頭。這樣區分有助于記憶和分類
mysql>?show?status?like?'%connections%'; +-----------------------------------+-------+ |?Variable_name???????????|?Value?| +-----------------------------------+-------+ |?Connection_errors_max_connections?|?0???| |?Connections????????????|?197??| |?Max_used_connections???????|?2???| +-----------------------------------+-------+
Connection_errors_max_connections 當MySQL的最大并發數大于mysql(show variables)中max_connections的最大并發數,因此而被拒絕的次數,將會記錄在這個變量里。如果Connection_error_max_connections值比較大,則說明當前系統并發比較高,要考慮調大max_connections的值。
Connections表示MySQL從啟動至今,成功建立連接的連接數,這個值是不斷累加的。
Max_used_connections表示MySQL從啟動至今,同一時刻并發的連接數,取得是最大值。如果這個值大于 max_connections則表明系統經常處于高并發的狀態,應該考慮調大最大并發連接數。
3、連接線程參數(thread variabls and status)
mysql>?show?variables?like?'thread%'; +--------------------+---------------------------+ |?Variable_name???|?Value???????????| +--------------------+---------------------------+ |?thread_cache_size?|?9?????????????| |?thread_concurrency?|?10????????????| |?thread_handling??|?one-thread-per-connection?| |?thread_stack????|?262144??????????| +--------------------+---------------------------+
thread_cache_size 設置連接線程緩存的數目。這個緩存相當于MySQL線程的緩存池(thread cache pool),將空閑的連接線程放入連接池中緩存起來,而非立即銷毀。當有新的連接請求時,如果連接池中有空閑的連接,則直接使用。否則要重新創建線程。創建線程是一個不小的系統開銷。MySQL的這部分線程處理和Nginx 的線程處理有異曲同工之妙,以后介紹Nginx的線程處理時,會拿來做對比。
thread_handling 默認值是: one-thread-per-connection 表示為每個連接提供或者創建一個線程來處理請求,直至請求完畢,連接銷毀或者存入緩存池。當值是no-threads 時,表示在始終只提供一個線程來處理連接,一般是單機做測試使用的。
thread_stack stack 是堆的意思,由PHP 進程詳解這篇博客,知道進程和線程都是有唯一的ID的,進程的ID系統會維護,二線程的ID,則由具體的線程庫區維護,當進程或者線程休眠的時候,進程的上下文信息要在內存中開辟出一塊區域,保存進程的上下文信息,以便于迅速喚醒程序。默認為MySQL的每個線程設置的堆棧大小為:262144/1024=256k
查看線程狀態信息
mysql>?show?status?like?'Thread%'; +-------------------+-------+ |?Variable_name???|?Value?| +-------------------+-------+ |?Threads_cached??|?1???| |?Threads_connected?|?1???| |?Threads_created??|?2???| |?Threads_running??|?1???| +-------------------+-------+
Thread_cached 當前線程池的線程數
Thread_connected 當前的連接數
Thread_cached: 當前連接線程創建數, 如果這個值過高,可以調整threadcachesize 也就是調整線程緩存池的大小。
Thred_runnint: 當前活躍的線程數。
連接請求堆棧
MySQL在很短的時間內,突然收到很多的連接請求時,MySQL會將不能來得及處理的連接請求保存在堆棧中,以便MySQL后續處理。back_log參數設置了堆棧的大小,可以通過如下命令查看:
mysql>?show?variables?like?'back_log'; +---------------+-------+ |?Variable_name?|?Value?| +---------------+-------+ |?back_log???|?80??| +---------------+-------+
連接異常
mysql>?show?status?like?'Aborted%'; +------------------+-------+ |?Variable_name??|?Value?| +------------------+-------+ |?Aborted_clients?|?0???| |?Aborted_connects?|?219??| +------------------+-------+
Aborted_clients MySQL 客戶機被異常關閉的次數。
Aborted_connects 試圖連接到MySQL服務器而失敗的連接次數。
other
mysql>?show?status?like?'Slow%'; +---------------------+-------+ |?Variable_name????|?Value?| +---------------------+-------+ |?Slow_launch_threads?|?0???| |?Slow_queries????|?0???| +---------------------+-------+
mysql>?show?variables?like?'slow_launch_time'; +------------------+-------+ |?Variable_name??|?Value?| +------------------+-------+ |?slow_launch_time?|?2???| +------------------+-------+
Slow_lunch_threads 創建線程的時間過長,超過slow_launch_time的設定值,則會記錄。
可以通過使用 Connection_error%來查看連接的錯誤狀態信息:
mysql>?show?status?like?'Connection_error%'; +-----------------------------------+-------+ |?Variable_name???????????|?Value?| +-----------------------------------+-------+ |?Connection_errors_accept?????|?0???| |?Connection_errors_internal????|?0???| |?Connection_errors_max_connections?|?0???| |?Connection_errors_peer_address??|?0???| |?Connection_errors_select?????|?0???| |?Connection_errors_tcpwrap?????|?0???| +-----------------------------------+-------+
Connection_errors_peer_address 查找MySQL客戶機IP地址是發生的錯誤數。