MySQL性能优化的配置参数thread_cache和table_cache详细解决方案
MySQL客户端的要求,为了提高性能创建连接的过程,提供了一个连接池thread_cache连接池、线程空闲的连接池,而不是立即销毁。这样的好处是,当有一个新的要求,MySQL将不会立即创建连接螺纹连接而去thread_cache找到自由线程,如果直接使用,不存在,创建一个新的螺纹连接。
有thread_cache MySQL中的几个重要参数,分别简要介绍如下:
thread_cache_size
thread_cache存储在线程的最大连接数。在thread_cache在短连接的应用效果是非常明显的,因为在连接和创建应用程序的数据库是非常频繁的,如果你不使用thread_cache作为资源消耗是非常令人印象深刻的!在长连接的同时并没有改善短接线如此明显,但效益明显。但不是越大越好的决心,而不是浪费资源,一般有一定的关系和物理内存,如下所示:
复制代码代码如下所示:
1G - 8
2G - 16
3G > 32
> 3G > 64
如果短连接较多,则可以适当增加。
thread_stack
当每个连接被创建时,MySQL分配给它的内存。这个值一般假定默认情况下可以应用于大多数场景,除非有必要,不要移动它。
thread_handing
对thread_cache连接使用,5.1.19增添新的功能。有两种可选{没有螺纹|一线程每连接}值看字面意思你应该猜八或九点,哈哈,没有线程服务器使用一个线程每连接的服务器为每个客户端请求的线程使用一个线程。在原始手册中提到,在Linux测试中没有线程被关闭。
复制代码代码如下所示:
MySQL >显示变量like'thread %;
+ + +
| variable_name |价值|
+ + +
| thread_cache_size | 32 |
| thread_handling | |每连接一个线程
| thread_stack | 196608 |
+ + +
3行(0.01秒)
显示%连接%的状态;
+ + +
| variable_name |价值|
+ + +
|连接| 199156 |
| max_used_connections | 31 |
+ + +
2行(0秒)
显示%线程%的状态;
+ + +
| variable_name |价值|
+ + +
| delayed_insert_threads | 0 |
| slow_launch_threads | 0 |
| threads_cached | 3 |
| threads_connected | 6 |
| threads_created | 8689 |
| threads_running | 5 |
+ + +
6行(0秒)
Through the above 3 commands, we can see that there are at most 32 connection threads in the thread_cache pool of the server, and one thread for each client ball. 为每个连接线程分配内存空间192k。
服务器共有199156次,最大并发连接数是31,目前在thread_cashe池连接数为3,连接数为6,有效5,共8689次创建连接。显然这里是短连接。你可以计算为thread_cache命中率的公式:
复制代码代码如下所示:
thread_cache_hit =(connections-thread_created) /连接* 100%
的thread_cache切中当前服务器率大约是95.6%,这是相当令人满意的。但可以看出,thread_cache_size有点多余,这是更合理的将它更改为16或8。
二,table_cache(5.1.3和后来的版本也被称为table_open_cache)
因为MySQL是一个多线程机制,为了提高性能,每个线程都打开自己的表描述符,而不是共享它。不同的存储引擎是不同的。
在MyISAM引擎,数据文件描述符(广义)不共享,但共享索引文件描述符的所有线程,InnoDB使用表空间的类型,如果是共享表空间,数据文件描述符的实际数据文件将占用更少的空间比表。
个人觉得有点像PHP fopen打开一个连接。数据完成后,它不会立即关闭,而是缓存。等待下一个连接时,文件的请求不需要重新打开文件。
手册描述了表打开的时间:
复制代码代码如下所示:
MyISAM表打开每个并发访问。这意味着如果两个线程访问同一个表,或者一个线程在同一个查询中访问两次表(例如,通过将表连接到自身,每个并发打开),那么表需要打开两次。需要表缓存中的条目。任何MyISAM表先打开需要两个文件描述符:一个数据文件和一个索引文件。表的每一个额外的使用只为数据文件使用一个文件描述符。索引文件描述符在所有线程之间共享。
如果你是在处理tbl_name开语句打开一个表,一个表将被分配专门的线程。表不被其他线程共享的,只有当线程调用处理程序tbl_name关闭或线程终止。表后关闭,桌子拉开表缓存(如果高速缓存是不满意)。
推荐的大小在MySQL手册:table_cache = max_connections×n
n表示查询语句中的最大表数,临时表和文件需要一些附加的文件描述符。
这个数据存在很多疑问。如果table_cache是不够的,检查opened_tables价值。如果这个值很大或是很快的,你要考虑增加table_cache。
在下列条件下,未使用的表将被关闭并从表缓存中删除:
当缓存满时,一个线程试图打开一个不在缓存中的表。
当缓存包含多table_cache条目,缓存中的表是没有任何线程使用。
当表刷新操作发生,它发生在FLUSH TABLES语句执行或mysqladmin flush-tables刷新或mysqladmin命令被执行。
当表被缓存时,服务器使用以下过程查找要使用的缓存条目:
当前未使用的表被释放,最近使用的顺序。
如果缓存已满且没有表可以释放,则需要打开一个新表,缓存必须临时展开。
如果缓存处于临时扩展状态,表从使用中更改为非使用状态,则它将从缓存中关闭并释放。
对于table_cache几个状态值:
1。table_cache:由所有线程的打开的表的数量。增加这个值可以增加文件描述符需要由mysqld数。默认值是64。
2。open_tables:表正在打开数。
三.opened_tables:表缓存未命中数,如果opened_tables较大,该table_cache值可能太小。
4。open_table_definitions:数FRM文件缓存。添加了这个变量。
5。opened_table_definitions:数量已缓存的FRM文件。这个变量