线程缓存保存了和当前连接无关的线程,这些线程可以供新连接使用。当要求一个新的连接时,如果线程缓存中的连接能够被使用时,新的连接就不会被创建,而使用线程缓存中的连接。当连接关闭时,又会将该线程放回到线程缓存中(前提是线程缓存中有可用的空间)。
 
参数thread_cache_size用于控制线程缓存的大小,默认值为0,表示没有线程缓存,这个参数为动态参数可以随时更改,如下:
 
  
  1. mysql> show variables like 'thread_cache_size'
  2. +-------------------+-------+ 
  3. | Variable_name     | Value | 
  4. +-------------------+-------+ 
  5. | thread_cache_size | 0     | 
  6. +-------------------+-------+ 

 

通过 Threads_cached 和 Threads_created  状态变量来监控已缓存的线程数和已创建的线程数。当系统有大量的连接时,根据Threads_created或Threads_connected状态变量的值来适当调整线程缓存的大小,以减少线程创建的开销。

 

 
  
  1. --显示和线程相关的状态变量 
  2. mysql> show status like 'thread_%'
  3. +-------------------+-------+ 
  4. | Variable_name     | Value | 
  5. +-------------------+-------+ 
  6. | Threads_cached    | 0     |      --已缓存的线程数 
  7. | Threads_connected | 3     |   --已连接的线程数 
  8. | Threads_created   | 9     |      --已创建的线程数 
  9. | Threads_running   | 1     |     --正在运行的线程数 
  10. +-------------------+-------+ 

 

MySQL线程缓存原理与连接池原理相似。

 

表缓存由两部分构成,表打开缓存与表定义缓存。
线程缓存和表缓存都不会使用太多的内存,尽管创建新连接与打开文件并不是昂贵的操作,但是在高并发情况下,开销就会上升的很快,缓存线程和表能够提高效率。
 
 
  
  1. --两个表缓存参数 
  2. mysql> show variables like '%table%cache%'
  3. +------------------------+-------+ 
  4. | Variable_name          | Value | 
  5. +------------------------+-------+ 
  6. | table_definition_cache | 400   | 
  7. | table_open_cache       | 64    | 
  8. +------------------------+-------+ 
  9. rows in set (0.00 sec) 
  10.  
  11. --有关表缓存的状态变量 
  12. mysql> show status like 'Open%table%'
  13. +--------------------------+-------+ 
  14. | Variable_name            | Value | 
  15. +--------------------------+-------+ 
  16. | Open_table_definitions   | 38    | 
  17. | Open_tables              | 31    | 
  18. | Opened_table_definitions | 0     | 
  19. | Opened_tables            | 0     | 
  20. +--------------------------+-------+ 
  21. rows in set (0.00 sec) 
 
如果 Opened_tables  状态变量的值很大或正在上升,就说明表缓存不够大,需要增加 table_open_cache的值;Opened_table_definitions状态变量也同样如此。
 
参考: 高性能MySQL (第二版)