MySQL如何管理客户端的连接?
MySQL可以监听不同接口的客户端连接,并通过一个连接管理线程控制所有的客户端连接。
在Unix平台上,连接管理线程可以控制来自Unix socket文件的请求。在Windows平台上可以控制来自shared memory连接请求和named-pipe连接请求。除此之外、MySQL支持来自所有平台的TCP/IP连接请求,从MySQL8.0开始,额外增加了一个通过TCP/IP接收的管理专用连接请求。
MySQL管理客户端的连接方式有两种:
一、连接管理线程为每个客户端的连接分配一个专用线程,用来进行认证及处理每个连接的请求。在这种方式里管理线程会使用到线程缓存,当监听到一个客户端的连接,管理线程会先在线程缓存里面进行查找,确认里面是否包含可以用于连接的线程,如果不存在,则会创建一个新线程。连接结束时,如果缓存未满,会将线程返回给线程缓存。
在这种连接方式下,如果服务器需要控制大量的连接,会为服务器带来不断创建和处理线程的开销,大量的线程会影响到服务器和内核的资源,例如栈空间等。为了保持大量的并发连接,每个线程使用的栈空间尽可能保持较小,这样就会导致栈空间太小,或服务器消耗大量的内存。与此同时,其它的资源也有可能耗尽,调度开销也会非常大。
可以通过MySQL的系统变量和状态变量对服务器的管理连接线程进行控制和监测。
thread_cache_size
:用来决定线程缓存的大小,如果将其配置为0,不使用缓存,将会为每个连接创建一个线程,并在连接结束时终止该线程。设置为其它数值时,意味着将会缓存该数值的线程。
thread_stack
:控制着SQL语句的复杂度,存储过程的递归深度以及其它消耗内存的各种行为。根据需要为每个线程设置相应字节的栈大小。
Threads_cached
和Threads_created
:可以通过这两个状态变量来监控线程是否来自缓存。
max_connections
:控制着最大连接数,MySQL8.0之后,服务器允许的最大连接数为该变量值+1,额外的一个连接是管理账户专用,需要账户具有CONNECTION_ADMIN
权限,或者SUPER
权限。在8.0.19版本之前,用于群组复制的内部连接会计算在该数值之内,8.0.19之后用于群组复制的连接将分开计算。
客户端最大连接数受到下面几个因素的影响:
- 操作系统线程库的质量。
- 有效内存大小。
- 每个连接使用的内存大小。
- 每个连接的工作负载。
- 期望的应答时间。
- 有效的文件描述符数量(
open_files_limit
的值及操作系统的限制)。
Linux和Solaris客户支持500~1000的并发连接,如果使用了大量的内存,并且对应答时间要求不高,也可以使用超过10000的并发连接。
二、线程池方式,该方式需要使用线程池插件,这个插件包含在MySQL企业版里面,这个插件用于改善连接性能。关于其详细内容,将会在另外一篇里介绍,同时您也可以访问“https://dev.mysql.com/doc/refman/8.0/en/thread-pool.html” 进行阅读。
- CentOS7上ElasticSearch安装填坑记
- ASP.NET Core 阶段性总结
- Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程案例演示
- C# 窗体常用API函数 应用程序窗体查找
- C#进阶系列——WebApi接口测试工具:WebApiTestClient
- 由Dapper QueryMultiple 返回数据的问题
- 【初探IONIC】不会Native可不可以开发APP?
- MVC视图展现模式之移动布局解析-续集
- 在 ASP.NET MVC 中使用异步控制器
- MVC5 Entity Framework学习之异步和存储过程
- ConcurrentDictionary 对决 Dictionary+Locking
- 在ASP.NET 5中使用SignalR
- 避免在ASP.NET Core中使用服务定位器模式
- 直传文件到Azure Storage的Blob服务中
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- 教程 | 在华为鸿蒙OS上尝鲜,第一个“hello world”
- spring-boot-route(二十二)实现邮件发送功能
- 踩坑!JDK8中HashMap依然会死循环!
- 解决 idea 使用过程中让你觉得不爽的一些问题
- R语言SIR模型(Susceptible Infected Recovered Model)代码sir模型实例
- Java循环
- 手把手教你用Python网络爬虫获取壁纸图片
- List<E>集合接口特征、ArrayList与LinkedList使用注意及特征
- Object类与它的一些方法
- IO流简要介绍
- R语言用线性回归模型预测空气质量臭氧数据
- 缓冲流简要介绍
- FLASK数据库模型
- 选择排序图解与代码示例
- spring-boot-route(二十三)开发微信公众号