1.链接器负责什么?
2.什么是长链接?什么是短链接?
3.什么是链接线程池?
4.平时工做中能够如何优化链接数? mysql
链接器负责跟客户端创建链接、获取权限、维持和管理链接。
通常咱们会经过如下形式访问数据库。 这种方式为 TCP/IP 方式
。web
mysql -h$ip -P$port -u$user -p
复制代码
固然若是客户端和数据库都在一台机器上,可使用Unix Sockets方式
sql
mysql -uroot
复制代码
创建链接后,链接器会到权限表里面查出你拥有的权限。以后,这个链接里面的权限判断逻辑,都将依赖于此时读到的权限。一个用户成功创建链接后,即便你用管理员帐号对这个用户的权限作了修改,也不会影响已经存在链接的权限。修改完成后,只有再新建的链接才会使用新的权限设置。 数据库
根据断开链接的时机,把链接分为:长链接
和短链接
缓存
wait_timeout
时间后将自动断开链接,默认是8小时。短链接会频繁建立链接,若是在繁忙系统中可能会致使系统端口数被耗尽,从而没法链接。
长链接虽然避免了频繁的建立链接,可是链接过程当中请求使用到的内存空间须要到链接关闭才释放。因此若是长链接时间过长,可能会致使数据库内存猛增。
以PHP为例:服务器
长链接
的方式进行访问的。当请求结束,接口返回响应。这个长链接就断开了。能够经过 show processlist 来查看当前全部链接。我在项目中碰到过有一个状况是,编写了一个脚本,订阅一个消息队列,从队列消费消息,而后根据消息内容,读写数据库。可是因为前期业务量不足,消息队列可能很长一段时间没有消息消费,超过8小时后就致使了链接自动断开。 对于这种常驻脚本,推荐作法是每隔一段时间手动断开数据库链接,而后重连。或者执行了一些列复杂数据库请求后,断开链接,下次请求时从新链接网络
通常状况下,每一个链接对应一个线程。MySQL链接管理器线程
负责处理服务器侦听的网络接口上的客户端链接请求。
一旦有链接请求过来就新建线程
来处理。可是新建线程的成本是比较昂贵的,因此Mysql使用一个线程池
来缓存空闲的线程,以备后来的链接使用。
链接管理线程处理客户端链接请求过程是:
1.查看线程池中是否包含空闲的线程,若是有,取出一个线程给客户端链接请求。
2.若是没有空闲线程,查看已有链接数是否超过了最大链接数
,若是没有,则建立新的线程处理客户端链接请求。并发
首先有个重要的参数叫max_connections,
它指Mysql 最大链接数,例如设置为5,那么最多只有5个客户端能够同时链接。固然Mysql为root用户作了一个特殊处理,当链接数已经满时,root用户仍是能够链接上一个。也就是说最大其实能够容许max_connections + 1个root链接。
查看最大链接数性能
show variables like '%max_connections%';
复制代码
设置最大链接数,服务重启失效。 若是为了永久生效能够修改.cnf文件。优化
set GLOBAL max_connections = 200;
复制代码
咱们能够查看过去最大链接数,获得过去最多有过多少链接。
show global status like 'max_used_connections';
复制代码
那么为了给服务器留有余地,建议 max_used_connections/max_connections = 0.8
查看线程状况
show status like 'Threads%'
复制代码
能够经过控制thread_cache_size
来控制缓存线程池的大小。 并发增长的状况下,增长这个值能够改善系统性能。
查看能够缓存多少链接
show global variables like 'thread_cache_size';
复制代码
长链接
和短链接
max_connections
和thread_cache_size
能够改善系统性能。