1 MySQL连接介绍
1.1通信类型
同步通信依赖于被调用方,受限于被调用方的性能。也就是说,应用操作数据库,线程
会阻塞,等待数据库的返回。
1.2 异步通信
异步可以避免应用阻塞等待,但是不能节省 SQL 执行的时间。如果异步存在并发,每
一个 SQL 的执行都要单独建立一个连接,避免数据混乱。但是这样会给服务端带来巨大的
压力(一个连接就会创建一个线程,线程间切换会占用大量 CPU 资源)。另外异步通信还
带来了编码的复杂度,所以一般不建议使用。如果要异步,必须使用连接池,排队从连接池
获取连接而不是创建新连接。
2 连接方式
2.1 短连接
短连接操作步骤:
连接–>数据传输–>关闭连接。
2.2 长连接
长连接操作步骤
连接–>数据传输–>保持连接–>数据传输–>保持连接–>…………–>关闭连接
3 协议
3.1 TCP/IP
TCP/IP 套接字连接方式是 MySQL 在任何平台都提供的一种连接方式,也是网络中使用
最多的一种方式
3.2 Unix Socket
UNIX Socket 是连接 MySQL 需要一个物理文件,文件的存放位置在配置文件中有定义,
所以只能在 MySQL 客户端和数据库实例在同一台服务器上的情况下使用。它所有协议中最
高效的一个。
4 在服务端中查看连接信息
4.1 查看服务端中的连接数
show global status like ‘Thread%’
Thread_cached:线程缓存中的线程数
Thread_connected:当前打开的连接数
Thread_created:为处理连接而创建的线程数
Thread_running:未休眠的线程数
4.2 优化 Threads_created
threads_created 表示创建过的线程数,很明显,如果threads_created 过大,表明 mysql 服务
器一直在创建线程,这也是比较耗资源,说明服务器不健康。
4.2.1 解决方案
配置 thread_cache_size:
thread_cache_size 作用是当客户端断开之后,服务器处理此客户的线程将会缓存起来以
响应下一个客户而不是销毁(前提是缓存数未达上限)。MySQL<= 5.6.7 默认为 0,MySQL>=
5.6.8 默认值为-1(自动调整)。可设置为 0-16384。
查看 thread_cache_size:默认为10->可以缓存10个线程
show variables like ‘thread_cache_size’
设置规则:
如果是短连接,适当设置大一点,因为短连接往往需要不停创建,不停销毁,如果大一
点,连接线程都处于取用状态,不需要重新创建和销毁,所以对性能肯定是比较大的提升。
如果是长连接,可以设置成小一点,一般在 50-100 左右
根据物理内存设置规则:
1G —> 8
2G —> 16
3G —> 32
>=4G —> 64
set global thread_cache_size=64 //重启 mysql 后失效。
5 查看连接超时时间
5.1 交互式
交互式:是指使用客户端工具连接数据库服务端。如:Navicat、SQLyog 等。
全局: ->单位秒
show global variables like ‘interactive_timeout’
会话:
show session variables like ‘interactive_timeout’
5.2 非交互式
非交互式:是指使用 JDBC 方式连接数据服务端。
全局:
show global variables like ‘wait_timeout’
会话:
show session variables like 'wait_timeout
5.3 优化连接超时时间
5.3.1 交互式
全局
set global interactive_timeout=600;
会话
set session interactive_timeout=600;
5.3.2 非交互式
全局
set global wait_timeout=600;
会话
set session wait_timeout=600;
5.3.3 总结
wait_timeout 的作用是,设置非交互连接(就是指那些连接池方式、非客户端方式连接
的)的超时时间,默认是 28800,就是 8 小时,超过这个时间,mysql 服务器会主动切断那
些已经连接的,但是状态是 sleep 的连接
6 查看最大连接数
对客户端而言,MySQL 服务端的最大连接数是指服务端允许的最大连接并发数。
show variables like ‘max_connections’;
6.1 优化最大连接数
该参数设置过小的最明显特征是出现”Too many connections”异常。
如果服务器的并发连接请求量比较大,建议调高该值,以增加并行连接数量,当然这建
立在机器能支撑的情况下,因为如果连接数越多,介于 MySQL 会为每个连接提供连接缓冲
区,就会开销越多的内存,所以要适当调整该值,不能盲目提高设值。
通过命令修改
set global max_connections = 200; ->通过global设置的参数在服务器重启后会失效
通过配置文件修改 my.ini ->重启也不影响参数设置