mysql怎么设置thread

mysql怎么设置thread,第1张

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添加的新特性.有两个值可选[no-threads|one-thread-per-

connection] 看字面意思大家也该猜出八九分了,呵呵,no-threads

服务器使用一个线程,one-thread-per-connection

服务器为每个客户端请求使用一个线程.原手册中提到,no-threads是在Linux下调试用的.

复制代码 代码如下:

mysql>show variables like 'thread%'

+——————-+—————————+

| Variable_name | Value |

+——————-+—————————+

| thread_cache_size | 32|

| thread_handling | one-thread-per-connection |

| thread_stack | 196608|

+——————-+—————————+

3 rows in set (0.01 sec)

mysql>show status like '%connections%'

+———————-+——–+

| Variable_name| Value |

+———————-+——–+

| Connections | 199156 |

| Max_used_connections | 31 |

+———————-+——–+

2 rows in set (0.00 sec)

mysql>show status like '%thread%'

+————————+——–+

| Variable_name | Value |

+————————+——–+

| Delayed_insert_threads | 0 |

| Slow_launch_threads| 0 |

| Threads_cached | 3 |

| Threads_connected | 6 |

| Threads_created| 8689 |

| Threads_running| 5 |

+————————+——–+

6 rows in set (0.00 sec)

通过以上3个命令,可以看到服务器的 thread_cache池中最多可以存放32个连接线程,为每个客户端球使用一个线程.为每个连接的线程分配192k的内存空间.

服 务器总共有199156次连接,最大并发连接数为31,当前在thread_cashe池中的连接数为3个,连接数为6个,处于活跃状态的有5个,共创建 了8689次连接.显然这里以短连接为主.可以算出thread_cache命中率,公式为:

复制代码 代码如下:

Thread_Cache_Hit=(Connections-Thread_created)/Connections*100%

当前服务器的Thread_cache命中率约为95.6%这个结果我还是比较满意的.但是可以看出 thread_cache_size有点多余改成16或8更合理一些.

一般这种情况可能的原因有这几种:

1. 可能连接超过mysql设置的上限(你的应该没超)

2. 程序问题,建立了连接不关闭(这个有可能,看看你的session)

3. 在没有使用连接池的情况下,每次都建立一个新的连接到数据库(即使每次 *** 作完毕都及时准确的close了),但是由于可能建立到数据库连接的频率很高(比如在for循环里),那么会迅速建立大量的tcp连接到mysql的指定端口,OS在关闭tcp连接是有一定的延迟的,也是有一定数量限制的,所以就会出现无法连接的情况(connection refused)。

-------------------------------------

我个人感觉设置最大连接数可能用处不大,因为默认的是100,你说刚10个就出问题~所以我觉得可能还是和系统有关系,因为你说刷新的不频繁就不会报错~

不过你到可以先试试看~万一能行更好不是~

还有啊,你可以找别的机器试验下,在别人的电脑上做下测试~

数据连接池是把数据库连接放到中间服务器上,比如tomcat上,那么相当于每次你 *** 作数据库的时候就不需要再"连接"到数据库再进行相关 *** 作,而是直接 *** 作服务器上的"连接池",你可以根据字面意思进行理解,把数据库当做一条小溪,那么"连接池"就是一个"水池",这个水池里面的水是由事先架好的通向"小溪"的水管引进来的,所以,你想喝水的时候不必大老远地跑到小溪边上,而只要到这个水池就可以.这样的话就可以提高"效率".但是数据池一般是用在数据量比较大的项目,这样可以提高程序的效率,想一想这样的话是不是就把相关的负荷加在了服务器上,因为这个"池"是在服务器上的,对于小数据量处理的项目不推荐使用,应为过于频繁的请求会使得服务器负载加重

关系:

你 -->"水池"-->小溪(快速喝水)

程序-->"数据池"-->数据库(快速存取)

就是这样,也不用把它想神秘了,我是这样理解的,也就这样说了,希望对你有帮助


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/6104725.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-14
下一篇 2023-03-14

发表评论

登录后才能评论

评论列表(0条)

保存