調整 MySQL 併發相關的參數

MySQL server 是多線程結構,包括後臺線程和客戶服務線程。多線程能夠有效利用服務器資源,提升數據庫的併發性能。在 MySQL 中,控制併發鏈接和線程的主要參數包括 max_connections、back_log、thread_cache_size 以及 table_open_cache 等。sql

1、調整 max_connections,提升併發鏈接

參數 max_connections 控制容許鏈接到 MySQL 數據庫的最大數量。若是狀態變量 connection_errors_max_connections 不爲零,而且一直增加,就說明不斷有鏈接請求因數據庫鏈接數已達到最大容許的值而失敗,應考慮增大max_connections 的值。 數據庫

MySQL 最大可支持的數據庫鏈接取決於不少因素,包括給定操做系統平臺線程庫的質量、內存大小、每一個鏈接的符合以及指望的響應時間等。在 Linux 平臺下,MySQL 支持 500~1000 個鏈接不是難事,若是內存足夠,不考慮響應時間,甚至能達到上萬個鏈接。而在 windows 平臺下,受其所用線程庫的影響,最大鏈接數有如下限制: segmentfault

(open tables * 2 + open connections) < 2048 windows

每一個session 操做 MySQL 數據庫表都須要佔用文件描述符,數據庫鏈接自己也要佔用文件描述符,所以,在增大 max_connections 時,也要注意評估 open-files-limit (文件描述符)的設置是否夠用。緩存

2、調整 back_log

back_log 參數控制 MySQL 監聽 tcp 端口時設置的積壓請求棧大小,5.6.6版本之前的默認值是 50,5.6.6 版本之後的默認值是 50 + (max_connections/5),但最大不能超過 900。 服務器

若是須要數據庫在較短期內處理大量鏈接請求,能夠考慮適當增大 back_log 的值。session

3、調整 table_open_cache

每個 sql 執行線程至少都要打開一個表緩存,參數 table_open_cache 控制全部 sql 執行線程可打開表緩存的數量。這個參數的值應根據最大鏈接數 max_connections 以及每一個鏈接執行關聯查詢中所涉及表的最大個數(用 N 表示)來設定: 多線程

max_connection * N 併發

在未執行 flush tables 命令的狀況下,若是 MySQL 狀態值 opened_tables 的值較大,就說明 table_open_cache 設置的過小,應適當增大。增大 table_open_cache 的值,會增長 MySQL 對文件描述符的使用量,所以,也要注意評估 open-files-limit 的設置是或否夠用。tcp

4、調整 thread_cache_size

爲加快鏈接數據庫的速度,MySQL 會緩存必定數量的客戶服務線程以備重用,經過參數 thread_cache_size 可控制 MySQL 緩存客戶端線程的數量。
能夠經過計算線程 cache 的失效率 threads_created / connections 來衡量 thread_cahce_size 的設置是否合適,該值越接近 1,說明線程 cache 命中率越低,應考慮適當增長 thread_cahce_size 的值。

5、innodb_lock_wait_timeout 的設置

參數 innodb_lock_wait_timeout 能夠控制 innodb 事務等待行鎖的時間,默認值是 50ms,能夠根據須要動態設置。對於須要快速反饋的交互式應用,能夠將行鎖等待超時時間調大,以免發生大的回滾操做。

相關文章
相關標籤/搜索