mysql数据库每次查询是一条线程吗

mysql数据库每次查询是一条线程吗,第1张

MySQL的查询使用的是线程池。当有大量请求并发访问时,一定伴随着资源的不断创建和释放,导致资源利用率低,降低了服务质量。线程池技术,预先会创建一定数量的线程,当有请求达到时,线程池分配一个线程提供服务,请求结束后,该线程又去服务其他请求。 通过这种方式,避免了线程和内存对象的频繁创建和释放,降低了服务端的并发度,减少了上下文切换和资源的竞争,提高资源利用效率。在MySQL早期的版本中,处理连接的方式是One-Connection-Per-Thread,即对于每一个数据库连接,MySQL-Server都会创建一个独立的线程服务,请求结束后,销毁线程。再来一个连接请求,则再创建一个连接,结束后再进行销毁。但是,这种方式在高并发情况下,会导致线程的频繁创建和释放。当然,通过thread-cache,我们可以将线程缓存起来,以供下次使用,避免频繁创建和释放的问题,但是无法解决高连接数的问题。One-Connection-Per-Thread方式随着连接数暴增,导致需要创建同样多的服务线程,高并发线程意味着高的内存消耗,更多的上下文切换(cpu cache命中率降低)以及更多的资源竞争,导致服务出现抖动。相对于One-Thread-Per-Connection方式,一个线程对应一个连接,Thread-Pool实现方式中,线程处理的最小单位是statement(语句),一个线程可以处理多个连接的请求。这样,在保证充分利用硬件资源情况下(合理设置线程池大小),可以避免瞬间连接数暴增导致的服务器抖动。

线程池缓存大小

( 当客户端断开连接后 将当前线程缓存起来 当在接到新的连接请求时快速响应 无需创建新的线程 )

查看 thread_cache_size

show global variables like 'thread_cache_size'

设置 thread_cache_size

set global thread_cache_size = 20 (立即生效重启后失效)

MySQL 配置文件 my.cnf 中 mysqld 下添加 thread_cache_size

[mysqld]

thread_cache_size = 20

可以通过如下几个MySQL状态值来适当调整线程池的大小

可以通过 show global status like 'Threads_%' 命令查看以上4个状态值

当 Threads_cached 越来越少 但 Threads_connected 始终不降 且 Threads_created 持续升高

这时可适当增加 thread_cache_size 的大小

MySQL 5.7 参考手册 - thread_cache_size


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

原文地址: http://outofmemory.cn/sjk/9987999.html

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

发表评论

登录后才能评论

评论列表(0条)

保存