- Mysql并發引數調整
- 1 max_connections
- 2 back_log
- 3 table_open_cache
- 4 thread_cache_size
- 5 innodb_lock_wait_timeout
Mysql并發引數調整
從實作上來說,MySQL Server 是多執行緒結構,包括后臺執行緒和客戶服務執行緒,多執行緒可以有效利用服務器資源,提高資料庫的并發性能,在Mysql中,控制并發連接和執行緒的主要引數包括 max_connections、back_log、thread_cache_size、table_open_cahce,
1 max_connections
采用max_connections 控制允許連接到MySQL資料庫的最大數量,默認值是 151,如果狀態變數 connection_errors_max_connections 不為零,并且一直增長,則說明不斷有連接請求因資料庫連接數已達到允許最大值而失敗,這是可以考慮增大max_connections 的值,
說明:當同時連接的請求超過151個之后,就沒有可用的連接來處理客戶端的請求了,后面進來的這些連接都會處于等待狀態,等待MySQL連接被釋放,如果沒有空閑的連接,就會請求超時
Mysql 最大可支持的連接數,取決于很多因素,包括給定作業系統平臺的執行緒庫的質量、記憶體大小、每個連接的負荷、CPU的處理速度,期望的回應時間等,在Linux 平臺下,性能好的服務器,支持 500-1000 個連接不是難事,需要根據服務器性能進行評估設定,
2 back_log
back_log 引數控制MySQL監聽TCP埠時設定的積壓請求堆疊大小,如果MySql的連接數達到max_connections時,新來的請求將會被存在堆疊中,以等待某一連接釋放資源,該堆疊的數量即back_log,如果等待連接的數量超過back_log,將不被授予連接資源,將會報錯,5.6.6 版本之前默認值為 50 , 之后的版本默認為 50 + (max_connections / 5), 但最大不超過900,
說明:當客戶端同時發過來的請求并發量大于151,后面過來的請求處于等待的狀態,那么等待的連接數可以達到back_log,這些新來的請求就會被存盤在堆疊當中,以等待某個連接被釋放,該堆疊的數量就通過back_log來設定,
如果需要資料庫在較短的時間內處理大量連接請求, 可以考慮適當增大back_log 的值,
3 table_open_cache
該引數用來控制所有SQL陳述句執行執行緒可打開表快取的數量, 而在執行SQL陳述句時,每一個SQL執行執行緒至少要打開 1 個表快取,該引數的值應該根據設定的最大連接數 max_connections 以及每個連接執行關聯查詢中涉及的表的最大數量來設定 :
? max_connections x N ;
說明:這個不是針對于某個會話的,這個是針對于所有客戶端執行執行緒,表快取的數量,也就是每個SQL陳述句中操作表的個數,比如一條SQL陳述句一般至少操作一張表,操作一張表,就有1個表快取,操作多張表,就有多個表快取,
mysql> show variables like 'table_open_cache%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| table_open_cache | 431 |
| table_open_cache_instances | 16 |
+----------------------------+-------+
2 rows in set (0.06 sec)
4 thread_cache_size
為了加快連接資料庫的速度,MySQL 會快取一定數量的客戶服務執行緒以備重用,通過引數 thread_cache_size 可控制 MySQL 快取客戶服務執行緒的數量,
說明:這就相當于在MySQL的服務端開啟了一個執行緒池,客戶端有請求過來,我們在執行緒池中拿出一個執行緒來執行任務處理,
mysql> show variables like 'thread_cache_size%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| thread_cache_size | 8 |
+-------------------+-------+
1 row in set (0.00 sec)
一共快取了8個執行緒資訊,
5 innodb_lock_wait_timeout
該引數是用來設定InnoDB 事務等待行鎖的時間,默認值是50ms , 可以根據需要進行動態設定,對于需要快速反饋的業務系統來說,可以將行鎖的等待時間調小,以避免事務長時間掛起; 對于后臺運行的批量處理程式來說, 可以將行鎖的等待時間調大, 以避免發生大的回滾操作,
說明:如果在比較快速回應的業務系統中,如果沒有拿到行鎖,就直接報錯即可,不需要讓事務長時間回應,
可以看到,默認超時時間為50ms
mysql> show variables like 'innodb_lock_wait_timeout%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| innodb_lock_wait_timeout | 50 |
+--------------------------+-------+
1 row in set (0.01 sec)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/253542.html
標籤:其他
上一篇:MySQL 幻象行
下一篇:史上超強最常用SQL陳述句大全
