線程緩存保存了和當前連接無關的線程,這些線程可以供新連接使用。當要求一個新的連接時,如果線程緩存中的連接能夠被使用時,新的連接就不會被創建,而使用線程緩存中的連接。當連接關閉時,又會將該線程放回到線程緩存中(前提是線程緩存中有可用的空間)。
參數thread_cache_size用於控制線程緩存的大小,默認值爲0,表示沒有線程緩存,這個參數爲動態參數可以隨時更改,如下:
- mysql> show variables like 'thread_cache_size';
- +-------------------+-------+
- | Variable_name | Value |
- +-------------------+-------+
- | thread_cache_size | 0 |
- +-------------------+-------+
通過 Threads_cached 和 Threads_created 狀態變量來監控已緩存的線程數和已創建的線程數。當系統有大量的連接時,根據Threads_created或Threads_connected狀態變量的值來適當調整線程緩存的大小,以減少線程創建的開銷。
- --顯示和線程相關的狀態變量
- mysql> show status like 'thread_%';
- +-------------------+-------+
- | Variable_name | Value |
- +-------------------+-------+
- | Threads_cached | 0 | --已緩存的線程數
- | Threads_connected | 3 | --已連接的線程數
- | Threads_created | 9 | --已創建的線程數
- | Threads_running | 1 | --正在運行的線程數
- +-------------------+-------+
MySQL線程緩存原理與連接池原理相似。
表緩存由兩部分構成,表打開緩存與表定義緩存。
線程緩存和表緩存都不會使用太多的內存,儘管創建新連接與打開文件並不是昂貴的操作,但是在高併發情況下,開銷就會上升的很快,緩存線程和表能夠提高效率。
- --兩個表緩存參數
- mysql> show variables like '%table%cache%';
- +------------------------+-------+
- | Variable_name | Value |
- +------------------------+-------+
- | table_definition_cache | 400 |
- | table_open_cache | 64 |
- +------------------------+-------+
- 2 rows in set (0.00 sec)
- --有關表緩存的狀態變量
- mysql> show status like 'Open%table%';
- +--------------------------+-------+
- | Variable_name | Value |
- +--------------------------+-------+
- | Open_table_definitions | 38 |
- | Open_tables | 31 |
- | Opened_table_definitions | 0 |
- | Opened_tables | 0 |
- +--------------------------+-------+
- 4 rows in set (0.00 sec)
如果Opened_tables 狀態變量的值很大或正在上升,就說明表緩存不夠大,需要增加table_open_cache的值;Opened_table_definitions狀態變量也同樣如此。
參考:高性能MySQL (第二版)